ROWNUM疑似列
ノート:
-
ROW_NUMBER
組込みSQLファンクションは、問合せの結果の順序付けを強力にサポートします。詳細は、「ROW_NUMBER」を参照してください。 -
SELECT
文のrow_limiting_clause
は、問合せから返される行数を制限するための強力なサポートを提供します。詳細は、「row_limiting_clause」を参照してください。
ROWNUM
疑似列は、問合せによって戻される各行について、表や結合処理された行の集合からOracleが行を選択する順序を示す番号を戻します。つまり、選択される最初の行のROWNUM
は1、2番目の行のROWNUMは2です(以降同様に続きます)。
次の例のように、ROWNUM
を使用して問合せによって戻される行数を制限できます。
SELECT * FROM employees WHERE ROWNUM < 11;
同じ問合せでROWNUM
にORDER
BY
句が続く場合、ORDER
BY
句によって行が再び順序付けられます。結果は、行がアクセスされる方法によって異なります。たとえば、ORDER
BY
句の指定によってOracleが索引を使用してデータにアクセスする場合、索引なしの場合とは異なる順序で行が取り出されることがあります。このため、次の文では、前述の例と同じ行が戻されるとはかぎりません。
SELECT * FROM employees WHERE ROWNUM < 11 ORDER BY last_name;
ORDER
BY
句を副問合せに埋め込んでROWNUM
条件をトップレベル問合せに置いた場合、行の順序付けの後でROWNUM
条件を強制的に適用させることができます。たとえば、次の問合せは、小さい順に10個の従業員番号を持つ従業員を戻します。これは、上位N番のレポートと呼ばれることがあります。
SELECT * FROM (SELECT * FROM employees ORDER BY employee_id) WHERE ROWNUM < 11;
前述の例では、ROWNUM
値はトップレベルのSELECT
文の値です。これらの値は、副問合せ内のemployee_id
によって行が順序付けられた後で生成されます。
比較条件「ROWNUM
値>正の整数」は、常に偽となるため注意してください。たとえば、次の問合せでは行は戻されません。
SELECT * FROM employees WHERE ROWNUM > 1;
最初にフェッチされる行のROWNUM
には1が割り当てられるため、条件は偽と判断されます。2番目にフェッチされる予定だった行は最初の行になるため、このROWNUM
にも1が割り当てられ、条件も偽と判断されます。このように、後続するすべての行が条件を満たさないため、行は戻されません。
また、次の例のように、ROWNUM
を使用して表の各行に一意の値を割り当てることもできます。
UPDATE my_table SET column1 = ROWNUM;
行に一意の番号を割り当てる別の方法については、「ROW_NUMBER」を参照してください。
ノート:
問合せでROWNUM
を使用した場合、ビューの最適化に影響することがあります。