こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

意味は同じはずなのに結果が違います。

SELECT *
FROM テーブルA
LEFT OUTER JOIN
( SELECT * FROM テーブルB WHERE テーブルB.列X IS NOT NULL) as テーブルB
ON テーブルA.列A = テーブルB.列A

SELECT *
FROM テーブルA
LEFT OUTER JOIN テーブルB
ON テーブルA.列A = テーブルB.列A
WHERE
テーブルB.列X IS NOT NULL

上のSQLも下の同じ事をしてると思うのですが
上では検索結果が10件出た場合
下では0件になってしまいます。

SQL自体シンプルで間違っていないと思うのですがなぜでしょうか?

投稿日時 - 2008-02-22 20:02:50

QNo.3800096

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

「LEFT OUTER JOIN 」ではなく「INNER JOIN」ならば同じになりますね。
「LEFT OUTER JOIN」は右側のテーブルに合致する行がない場合、その列はすべてNULLになります。ここがミソです。
( SELECT * FROM テーブルB WHERE テーブルB.列X IS NOT NULL)
として、XがNULLの行を除いたつもりでも、
「LEFT OUTER JOIN」で復活してしまう、そんなイメージです。

投稿日時 - 2008-03-01 14:24:34

ANo.1

>意味は同じはず

同じではありません。

最初のSQLは、テーブルAに対応しないテーブルBの行も、nullで検索されます。
つまり、テーブルB.列Xがnullの行も検索されます。

二つ目のSQLは、テーブルB.列Xがnullの行はwhereで除外されます。

投稿日時 - 2008-02-22 20:57:33

あなたにオススメの質問