MAX関数とNOT EXISTSを用いたサブクエリの解釈のされ方
877759Jul 25 2011 — edited Jul 26 2011はじめまして。
サブクエリを使用した時の内部的な処理の動きについてご教授ください。
11gを使用しています。
■やりたいこと
T_QUESTION・・・F_SEQUENCE と F_VERSION の複合キー
T_RESULT・・・F_SEQUENCE と F_VERSION の複合キー
というテーブルがあり、
T_QUESTIONの中から、各F_SEQUENCEの最大F_VERSIONの、F_SEQUENCEとF_VERSIONの組み合わせで、
且つその組み合わせがT_RESLUTに存在しないものだけを取得したい。
■テーブル内データ
・T_QUESTION
F_SEQUENCE, F_VERSION
1, 0 ←これと
2, 0 ←これを取得したい
3, 0
3, 1
・T_RESULT
F_SEQUENCE, F_VERSION
3, 1
■意図しない結果を返すSQL:
SELECT
Q.F_QSEQNO,
MAX(Q.F_VERSION)
FROM
T_QUESTION Q
WHERE
NOT EXISTS(SELECT * FROM T_RESULT R WHERE R.F_QSEQNO=Q.F_QSEQNO AND R.F_VERSION=Q.F_VERSION)
GROUP BY F_QSEQNO;
結果は、
F_SEQUENCE:1,F_VERSION:0
F_SEQUENCE:2,F_VERSION:0
F_SEQUENCE:3,F_VERSION:0 ←これは取得したくない。
■自分の解釈
1.一番外側の SELECT Q.F_QSEQNO,MAX(Q.F_VERSION) が実行され、1,0 2,0 3,1 が選択される。
2.選択された 1,0 2,0 3,1 の組み合わせの中からT_RESULTに存在しない組み合わせだけが選択される。
■疑問
1.内側のSELECT * FROM T_RESULT R WHERE R.F_QSEQNO=Q.F_QSEQNO AND R.F_VERSION=Q.F_VERSIONが最初に解釈されるのか?
2.意図した結果を取得するためにはどこを変えたらよいのか?
3.MAX(Q.F_VERSION)にエイリアスを振った場合、そのエイリアスを内側のSELECT文内で使うようなことはできないのか?(使おうとしたら「ORA-00904: "VVV": 無効な識別子です。」というエラーになりました。)
■参考
WHERE句を取り除いた下記SQLを実行すると、
SELECT
Q.F_QSEQNO,
MAX(Q.F_VERSION)
FROM
T_QUESTION Q
GROUP BY F_QSEQNO;
結果は、
F_SEQUENCE:1,F_VERSION:0
F_SEQUENCE:2,F_VERSION:0
F_SEQUENCE:3,F_VERSION:1
となりました。
本格的に勉強し始めたばかりで根本的な間違いがあるかもしれません。
おかしな点や不明瞭な点があればご指摘ください。
以上、宜しくお願い致します。