###前提・実現したいこと
oracle 11gのDBで「テーブルの特定カラムをキーにソートし(例えば生徒のテスト点数の降順)上位N人を抽出する」と言う仕様のSQLがあります(既に動作中)。そのSQLが、厳密に仕様を満たしているかどうか、有識者の方のご意見をいただけないでしょうか。
###発生している問題・エラーメッセージ
エラーは現時点で特に発生していません。
しかし、「サブクエリ内でのソート順は、メインクエリでは厳密に保証されないのではなかったか?」と言う指摘があり、回答に困っている状態です。
###該当のソースコード
SELECT *
FROM(
SELECT *
FROM 生徒別点数テーブル
ORDER BY 点数 DESC
)
WHERE ROWNUM <= 10;
###試したこと
oracle 11gのリファレンスには、ROWNUMを利用した上記SQLで、点数上位10名が取得可能と読み取れます。
「ORDER BY句を副問合せに埋め込んでROWNUM条件をトップレベル問合せに置いた場合、行の順序付けの後でROWNUM条件を強制的に適用させることができます。たとえば、次の問合せは、小さい順に10個の従業員番号を持つ従業員を戻します。」
https://docs.oracle.com/cd/E16338_01/server.112/b56299/pseudocolumns009.htm
しかし、指摘の「サブクエリ内のソートがメインクエリでは厳密に保証されない」が真の場合、サブクエリ内でのソートが、メインクエリのROWNUM連番取得時にはバラバラになってる可能性があります。
どなたか「その指摘が誤っている(=サブクエリ内のソート順は保証される)」、「そのリファレンスが誤っている」等、ご存知の方がいれば見解を頂きたく存じます。
###補足情報(言語/FW/ツール等のバージョンなど)
上記リファレンスにもある「ROW_NUMBERを用いた確実な方法」がある事は承知しておりますが、既に動作しているSQLを大量に修正する事となり、可能なら既存ソースを継続使用したいと考えております。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/07 08:14
2017/10/07 09:09
2017/10/07 09:30 編集