2013-02-13 4 views
5

Mein Ziel genau zu tun ist, was ein LEFT OUTER JOIN beabsichtigt, das 4. Venn-Diagramm zu tun mit: SQL Diagrams:LEFT OUTER JOIN-Abfrage nicht zu erwarten Reihen Rückkehr

enter image description here

Meine Abfrage kehrt keine Werte In der Tat sollte es alle innerhalb der Consultant_Mitgliedschaften minus die, die in Consultant_Memberships_Lists gespeichert ist zurückgeben.

Bitte beachten Sie die SQL Fiddle für ein leichteres Verständnis:

SELECT * 
FROM consultant_memberships 
     LEFT OUTER JOIN consultant_memberships_list 
        ON consultant_memberships.`id` = 
         consultant_memberships_list.membership_id 
WHERE consultant_memberships_list.consultant_id = $id 
     AND consultant_memberships_list.membership_id IS NULL 

Die Abfrage ‚5‘ zu Demonstrationszwecken als ID wird mit den richtigen Zeilen zu versuchen und herausgreifen.

+1

Derzeit hat Ihre Frage fast keine Informationen, nur Links zu Informationen an anderer Stelle. Diese Links sind in Ordnung, aber Ihre Frage sollte auch die notwendigen Informationen enthalten. – ruakh

+1

(Auch Ihre Formulierung - "tatsächlich sollte [meine Abfrage] [...] sein" - klingt so, als ob Sie denken, dass Sie die Abfrage korrekt geschrieben haben, und das DBMS führt es einfach falsch aus versichere dir, das ist nicht der Fall.) – ruakh

+0

(Ich stimme ruakh zu. Ich änderte "richtig" auf "erwartet" im Titel und ermutige die Verwendung von neutralen/nicht anklagenden Sprache.) –

Antwort

13

Ihre aktuelle Abfrage ist grundsätzlich eine INNER JOIN wegen der consultant_id = 5 über die WHERE Klausel. Ich glaube, dass Sie tatsächlich verwenden möchten:

SELECT * 
FROM consultant_memberships m 
LEFT OUTER JOIN consultant_memberships_list l 
    ON m.`id` = l.membership_id 
    AND l.consultant_id = 5 
WHERE l.membership_id IS NULL; 

Siehe SQL Fiddle with Demo

+0

@Bluefeet - Es funktioniert perfekt und ich habe dabei mehr von dem LEFT OUTER JOIN erfahren. Danke für deine Hilfe, ich weiß es zu schätzen. – Ben

+1

@Svengali Sie sind herzlich willkommen, glücklich zu helfen. – Taryn

+2

+1 Dieses Prädikat in der WHERE-Klausel negiert die "äußere" Eigenschaft des LINKEN JOIN. Der einfachste Weg für mich, über den OUTER-Join nachzudenken, ist folgender: Wenn keine übereinstimmende Zeile gefunden wird, wird eine Dummy-Zeile generiert, so dass eine übereinstimmende Zeile zurückgegeben wird. Diese generierte Dummy-Zeile besteht ausschließlich aus NULL-Werten. Daher wird jedes "IS NOT NULL" -Prädikat in der WHERE-Klausel alle Dummy-Zeilen ausschließen, die generiert wurden. – spencer7593

2

Verwenden

SELECT * 
    FROM consultant_memberships 
     LEFT Outer JOIN consultant_memberships_list 
       ON consultant_memberships_list.membership_id = consultant_memberships.`id` 
       and consultant_memberships_list.consultant_id = 5 
where consultant_memberships_list.membership_id IS NULL; 

Die Where-Klausel vor in der Abfrage verwendet "consultant_memberships_list.consultant_id = 5" wurde die linke äußere vernachlässigen beitreten .

+1

Es könnte hilfreicher sein, wenn Sie erwähnten, welche Änderung Sie an der Abfrage vorgenommen haben (d. H. Ein Prädikat von einer WHERE-Klausel in eine ON-Klausel verschieben) und warum diese Änderung erforderlich ist. – spencer7593