日本語PDF

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;

同じ問合せでROWNUMORDER 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を使用した場合、ビューの最適化に影響することがあります。