• 締切済み

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

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

みんなの回答

  • agricap
  • ベストアンサー率40% (79/195)
回答No.2

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

回答No.1

>意味は同じはず 同じではありません。 最初のSQLは、テーブルAに対応しないテーブルBの行も、nullで検索されます。 つまり、テーブルB.列Xがnullの行も検索されます。 二つ目のSQLは、テーブルB.列Xがnullの行はwhereで除外されます。

関連するQ&A