web-dev-qa-db-ja.com

Oracle SQLから1行のみ選択する方法

Oracleの構文を使用して、テーブルDUALから1行だけ選択します。たとえば、私はこのクエリを実行したいです。

SELECT user 
  FROM DUAL

... 40レコードあります。しかし、私は1つのレコードしか必要としません。 ...そして、私はそれをWHERE句なしで実現させたいのです。

Table_nameフィールドに次のようなものが必要です。

SELECT FirstRow(user) 
  FROM DUAL
88
Ben

あなたはROWNUMを使います。

すなわち。

SELECT user FROM Dual WHERE ROWNUM = 1

http://docs.Oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm

148
mindvirus

私はこの「解決策」がコメントの1つに隠されているのを見つけました。私はしばらくそれを見ていたので、それを少し強調したいのです(まだコメントできないし、そのようなことをすることもできません)。

SELECT * FROM (SELECT [Column] FROM [Table] ORDER BY [Date] DESC) WHERE ROWNUM = 1

[Date]は常にSYSDATEを介して挿入されると想定して、テーブルの最新のエントリから目的の[Column]エントリを表示します。

35
user3890681

この構文はOracle 12cで使用可能です。

select * from some_table fetch first 1 row only;
select * from some_table fetch first 1 rows only;
select * from some_table fetch first 10 row only;
select * from some_table fetch first 10 rows only;

^^目的の行の数が複数であるかどうかにかかわらず、行または行(複数)を使用できることを実証したいだけです。

25
mancini0

私の知る限りでは、Oracleのdualテーブルは1行だけの特別なテーブルです。したがって、これで十分です。

SELECT user
FROM dual
7
ypercubeᵀᴹ

oracle DBテーブルの最初の行を取得する方法は3つあります。

1)select * from table_name where rownum= 1が最善の方法です

2)select * from table_name where id = ( select min(id) from table_name)

3)

    select * from 
         ( select * from table_name order by id )

   where nownum= 1    
5
Deva

????答えは:

次のようにネストしたクエリを使うべきです:

SELECT *
FROM ANY_TABLE_X 
WHERE ANY_COLUMN_X = (SELECT MAX(ANY_COLUMN_X) FROM ANY_TABLE_X) 

=> PL/SQLでは、 "ROWNUM = 1"はTSQLの "TOP 1"と等しくありません。

そのため、次のようなクエリは使用できません。 Oracleは最初の行を取得するので、次に句の順序を適用します。

5
Shortly FD

Oracleにはlimit 1条件(MySQL/PostgresSQL)はありません。where rownum = 1を指定する必要があります。

5
Oh Chin Boon

"FirstRow"は制限事項であるため、where句ではなくselect句に配置されます。そしてそれは大名と呼ばれます

select * from dual where rownum = 1;
5
gdoron

いずれかの行でうまくいく場合は、

select max(user)  
from table;

Where句はありません。

2
Raihan
select name, price
  from (
    select name, price, 
    row_number() over (order by price) r
      from items
  )
where r between 1 and 5; 
1
Andrew

select a.user from (select user from users order by user) a where rownum = 1

最高のパフォーマンスを発揮する別のオプションは次のとおりです。

select a.user 
from ( 
select user, 
row_number() over (order by user) user_rank, 
row_number() over (partition by dept order by user) user_dept_rank 
from users 
) a 
where a.user_rank = 1 or user_dept_rank = 2

異なるサブセットが必要なシナリオでは、RANK()を使用することもできますが、グループ化は必要ないため、row_number()over(...)も好きです。

1
Tyler