0

私は次のことをしようとしています:-

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 の行を取得する

助けてください。ありがとう

4

2 に答える 2

2

一致しないレコードを持つ左結合は、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 一致が見つかります。これは、一致がなかったことを示しているはずです (データの設定方法によって異なります)。

于 2013-03-29T22:43:30.923 に答える
0

解決:

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
于 2013-03-29T23:19:37.243 に答える