2016-06-14 4 views
0

Ich habe eine Tabelle A, die über eine Join-Tabelle J mit einer anderen Tabelle B verbunden ist. Wie kann ich auf alle Zeilen von Tabelle A zugreifen, die keine Entsprechung haben "join" Eintrag in J basierend auf einem gegebenen Attribut aus Tabelle B? Zum Beispiel:Suchen von Zeilen, die keinen entsprechenden Eintrag in der Join-Tabelle haben

Table A: 
------- 
id 

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

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

Sagen Sie, dass für eine gegebene B.name = „Suzie“, wie können wir bestimmen, alle Zeilen A, die in dem B.name = „Suzie“ keinen Eintrag in J mit B_id haben? Ich denke, das sollte eine einfache Abfrage sein, und ich überlegte, GROUP BY zu verwenden, weil es scheint, dass Sie für jeden Eintrag in A bestimmen möchten, ob die B_id, mit der Sie arbeiten (in diesem Fall B.name = "Suzie")) existiert in J für jede "Gruppe" von A_id's. Irgendwie kann ich mich nicht darum kümmern; würde einen Schub in die richtige Richtung schätzen.

Antwort

2

Sie können dies mit einem 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

Ich denke, es ist besser, 'SELECT 1' zu schreiben, wenn Sie' EXISTS() 'verwenden, da es klarer ist, dass die Spalten aus der inneren Auswahl nirgendwo benötigt werden. – sagi

+1

Richtig, das beseitigt einige Unklarheiten mit EXISTS-Anweisungen. – Siyual

0

ich eine andere Art und Weise glauben, dass dies zu tun, um eine LEFT OUTER JOIN auf der Join-Tabelle zu tun wäre, aber mit einem anderen ON Bedingung, dass J.b_id ist die b.id für die gewünschte "Name". Daher können Sie alle Artikel in A abrufen, die einen entsprechenden Artikel B haben oder nicht haben.

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 

Wäre neugierig auf irgendwelche Gedanken über die Leistung?

Verwandte Themen