SQLの実行順序

きょうさーこんなんやってみたんよ


SELECT COUNT(*) AS CNT
FROM TABLEA A
LEFT JOIN TABLEB B A.KEY = B.KEY
LEFT JOIN TABLEC C C.CKEY = NVL(B.VAL, A.VAL)
WHERE C.VAL2 IN( 1, 2 )
/


Cのキーにな、BのVALがあるんやったらBのVALで、
ないんやったらAのVALで結合したかったんよ。
で、その件数がほしかったんよ。
うまくいかんのよ。


自分の書き方にたこミスがあるはず、思って、
なんども見直してみたんよ。
どこもまちがってないんよ。
でもうまくいかんのよ。
結合できてないっぽいんよ。


でな、どっかで読んだ、SQLの実行順序ってお話を思い出したんよ。


1.FROM
2.WHERE
3.GROUP BY
4.HAVING
5.SELECT
6.UNIONとか
7.ORDER BY


とかやったと思ったんよ。
わし思ったんよ。
FROM句あたりが終わるまで、テーブルまたがった演算ってできんのかな?って。
わし、単純に上から書いた順に結合おわっとるはずと思うとったんよ。
でも、SQLが宣言型言語やってこと考えると、明示的に書いてない順番なんて
そのとおりに動作しちょったら、かえってまずいんちゃうん?と思ったんよ。
オプティマイザ苦しいやん?


で、しょうがないからこうしたんよ。
SELECT COUNT(*) AS CNT
FROM TABLEA A
LEFT JOIN TABLEB B A.KEY = B.KEY
LEFT JOIN TABLEC C C.CKEY = A.VAL
LEFT JOIN TABLEC D D.CKEY = B.VAL
WHERE NVL(C.VAL2, D.VAL2) IN( 1, 2 )
/


うまくいったんよ。
備忘録なんよこれ。


あと、似非関西弁に怒らないで☆いんよ。