OFFSET ROWS、FETCH NEXT ROWS、WITH TIES
問3
次のSQL文を実行しました。
SELECT last_name,salary FROM employees ORDER BY salary DESC OFFSET 3 ROWS FETCH NEXT 4 ROWS WITH TIES;
実行結果について正しい記述はどれですか? 最適なものを選択しなさい。
- a. エラーになる
- b. 給与が大きい順の5番目から7番目の3件が表示される(7番目と同額の行が複数存在する場合、最初の1件目が表示される)
- c. 給与が大きい順の4番目から7番目の行が表示される(7番目と同額の行が複数存在する場合、最初の3件が表示される)
- d. 給与が大きい順の4番目から7番目の行が表示される(7番目と同額の行が複数存在する場合、すべてが表示される)
本講座の第2回において、「FETCH FIRST
を使用して戻される行の数または割合を制限する」方法を説明しました。そのときには、ROWS ONLY
とWITH TIES
だけを説明して、OFFSET
は各自で勉強しておいてくださいねと言い残しました。本設問はOFFSET
とWITH TIES
の組み合わせです。
WITH TIES
は、行制限している最後の行と同じ値が連続して存在する場合、その行を表示するのでした。したがって、OFFSET
を覚えていなくても、選択肢のカッコ内の説明で正解できたかもしれませんね。ちなみに、OFFSET
は行制限をする前にスキップする行の数を指定します。
設問ではOFFSET 3 ROWS
ですから、3行スキップして4番目の行から表示されます。続いてFETCH NEXT 4 ROWS
ですから、表示件数は4件つまり7番目の行までが表示されます。さらにWITH TIES
が最後についているので、7番目の行と同額が複数存在する場合、すべて表示されます。したがって、選択肢dは正解です(以下は選択肢dでの実行例)。
SQL> SELECT last_name,salary FROM employees 2 ORDER BY salary DESC; LAST_NAME SALARY --------------- ---------- King 24000 Kochhar 17000 De Haan 17000 Russell 14000 Partners 13500 Hartstein 13000 Higgins 12008 Greenberg 12008 Errazuriz 12000 Ozer 11500 (以下省略) 108行が選択されました。 SQL> SELECT last_name,salary FROM employees 2 ORDER BY salary DESC OFFSET 3 ROWS FETCH NEXT 4 ROWS WITH TIES; LAST_NAME SALARY --------------- ---------- Russell 14000 Partners 13500 Hartstein 13000 Greenberg 12008 Higgins 12008