2016-06-14 4 views
0

テーブルAは、結合テーブルJを介して別のテーブルBに結合されています。テーブルAから対応するエントリを持たないすべての行にアクセスするにはどうすればよいですかテーブルBの特定の属性に基づいてJの "join"エントリを作成しますか?たとえば:結合テーブルに対応するエントリを持たない行を見つける

Table A: 
------- 
id 

Table J: 
------- 
A_id 
B_id 

Table B: 
------- 
id 
name 

は、与えられたB.name =「スージー」のために、どのように我々は、すべての行B_IDどこB.name =「スージー」とJのエントリを持っていないと判断することができると言いますか?私はこれが単純なクエリでなければならないと感じています。私はGROUP BYを使用することを検討しました。なぜなら、Aの各エントリについて、あなたが働いているB_id(ここでB.name = "Suzie" )は、A_idの各「グループ」に対してJ内に存在する。どういうわけか、私はこれの周りに私の頭を包むことはできません。正しい方向へのプッシュを感謝するでしょう。

答えて

2

あなたはWHERE NOT EXISTSでこれを行うことができます。

Select A.* 
From TableA A 
Where Not Exists 
(
    Select 1 
    From TableJ J 
    Join TableB B On B.id = J.B_id 
    Where J.A_id = A.id 
    And  B.Name = 'Suzie' 
) 
+1

内部選択からの列がどこにも必要でないことがより明確であるので、 'EXISTS()'を使用するときに 'SELECT 1'を書く方が良いと思います。 – sagi

+1

真、それは 'EXISTS'ステートメントであいまいさを取り除きます。 – Siyual

0

私はこれを行うための別の方法は、結合テーブルの上にLEFT OUTER JOINを行うことであろうと考えていますが、別のON条件でJ.b_idが希望のためにb.idであること"名"。したがって、対応するBアイテムを持っているか持っていないAのすべてのアイテムを取得することができます。

SELECT A.* 
FROM A 
LEFT OUTER JOIN J 
ON J.a_id = a.id AND J.b_id IN 
    (SELECT id FROM B where B.name "Suzie") 
WHERE J.a_id IS NULL 

パフォーマンスについてのご意見は興味がありますか?

関連する問題