質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

4273閲覧

SQLのサブクエリ内ソートの保証について

eboltex

総合スコア7

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/10/07 01:09

編集2017/10/07 01:18

###前提・実現したいこと
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を大量に修正する事となり、可能なら既存ソースを継続使用したいと考えております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

しかし、指摘の「サブクエリ内のソートがメインクエリでは厳密に保証されない」が真の場合、サブクエリ内でのソートが、メインクエリのROWNUM連番取得時にはバラバラになってる可能性があります。

ここの解釈が誤っています。

「サブクエリ内のソートがメインクエリでは厳密に保証されない」

これは正しいですが、

サブクエリ内でのソートが、メインクエリのROWNUM連番取得時にはバラバラになってる可能性があります。

これが誤りです。
ソート順序が保証されるされないという話ではなく、「取得する順序でROWNUMを割り当てる」という仕様を利用した抽出条件の話ですよね。

「サブクエリ内のソートがメインクエリでは厳密に保証されない」

ということであっても、議論に上がっているのは抽出条件の話であって、ソートについてでは無いので、論点が混同されています。

ただ、前提は提示されているサンプルコードでの話なので、From句内で上記サブクエリー以外が記述されている場合は、抽出条件は保証されないということになります。

投稿2017/10/07 02:52

編集2017/10/07 03:06
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eboltex

2017/10/07 08:14

早速のご回答ありがとうございます。 すいません、私の理解が追いついてないかと思いますので追加で質問させて下さい。 ご回答頂いている「取得する順序でROWNUMを割り当てる」という仕様がまさに肝で、 「取得する順序」がサブクエリで作成した表に依存する、と考えています。 サンプルコードのサブクエリでは、点数でソートされた表が作成されますが、 メインクエリで取得する際には、点数でソートされた表にはなっていないのでは? =取得する順序が点数でソートされていないのでは?と懸念しております。 全くの思い違いや、意味が不明等あればご指摘お願いします。
sazi

2017/10/07 09:09

ソートについてはorder by の指定が無い場合、保証するものはありません。 ですが、サブクエリーでソートされた結果を出力するだけ(joinやwhere条件など索引に関係するものが無ければ)なら、並びを変更される要因がないので、同じ結果となります。
eboltex

2017/10/07 09:30 編集

なるほど!詳しくご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問