私は次のことをしようとしています:-
SELECT t1.a, t1.b, t2.a, t2.b, t3.a, t3.b, t3.c
FROM t1 LEFT JOIN t2 ON t1.b = t2.b
LEFT JOIN t3 ON t2.b <> t3.b
WHERE t3.c = 'someuser'
結果:- t3 に関連付けられた t2 の行を取得しています
期待される結果:- t3 に関連付けられていない t2 の行を取得する
一致しないレコードを持つ左結合は、t3
. 最後の 2 行を変更しました。これを試して:
SELECT t1.a, t1.b, t2.a, t2.b, t3.a, t3.b, t3.c
FROM t1 LEFT JOIN t2 ON t1.b = t2.b
LEFT JOIN t3 ON t2.b = t3.b
WHERE t3.c = 'someuser' and t3.b is null
ただし、t3 で条件付きチェックを行っている場合は、常に false になります (null をチェックしていない場合)...
多分あなたはこれが欲しいですか?
SELECT t1.a, t1.b, t2.a, t2.b, t3.a, t3.b, t3.c
FROM t1 LEFT JOIN t2 ON t1.b = t2.b
LEFT JOIN t3 ON t2.b = t3.b and t3.c = 'someuser'
WHERE t3.b is null
2 つのクエリの違いは次のとおりです。t3.b が null であると予想されるため、最初のクエリは常に 0 行を返す必要があります (これは、結合されたテーブルに一致するレコードがないことを示している可能性があります)。ただし、t3.c で値を確認します。結果には決して存在しません。結合中に t3.c で 2 番目のクエリをフィルター処理すると、WHERE 句で null 一致が見つかります。これは、一致がなかったことを示しているはずです (データの設定方法によって異なります)。
解決:
SELECT t1.a, t1.b, t2.a, t2.b, t3.a, t3.b, t3.c
FROM t1 LEFT JOIN t2 ON t1.b = t2.b
LEFT JOIN t3 ON t2.b = t3.b and t3.c = 'someuser'
WHERE t3.b is null GROUP BY t3.c