重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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自体シンプルで間違っていないと思うのですがなぜでしょうか?

A 回答 (2件)

「LEFT OUTER JOIN 」ではなく「INNER JOIN」ならば同じになりますね。


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

>意味は同じはず



同じではありません。

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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!