2013-02-13 13 views
5

Moim celem jest, aby zrobić dokładnie to, co LEFT OUTER JOIN zamierza zrobić używając 4th diagramu Venna: SQL Diagrams:LEFT OUTER JOIN zapytanie nie wracać oczekiwanych wierszy

enter image description here

Moje zapytanie nie zwraca żadnej wartości w ogóle, w rzeczywistości powinno to być zwrócenie wszystkich w ramach Numerów Konsultanta minus ten, który jest przechowywany w Licytacjach Consultant_Memberships.

proszę zobaczyć SQL Fiddle dla łatwiejszego zrozumienia:

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 

Zapytanie jest za pomocą „5” jako identyfikator dla celów demonstracyjnych, aby spróbować i wybrać odpowiednie wiersze.

+1

Obecnie na twoje pytanie nie ma prawie żadnych informacji, a jedynie linki do innych informacji. Te linki są w porządku, ale twoje pytanie powinno również zawierać niezbędne informacje. – ruakh

+1

(Także twoje frazowanie - "w rzeczywistości [moje zapytanie] powinno być [...]" - sprawia, że ​​brzmi to tak, jakbyś myślał, że poprawnie napisałeś zapytanie, a DBMS po prostu źle je wykonuje. Zapewniam cię, że tak nie jest.) – ruakh

+0

(Zgadzam się z ruakh, zmieniłem "poprawny" na "oczekiwany" w tytule i zachęcam do używania neutralnego/nie oskarżającego języka.) –

Odpowiedz

13

Bieżące zapytanie polega zasadniczo na wykonaniu INNER JOIN z powodu klauzuli consultant_id = 5 na klauzuli WHERE. Wierzę, że rzeczywiście chcesz używać:

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; 

Zobacz SQL Fiddle with Demo

+0

@Bluefeet - Działa idealnie i nauczyłem się więcej LEFT OUTER JOIN w procesie. Dziękuję za pomoc, doceniam to. – Ben

+1

@Svengali, serdecznie zapraszamy, chętnie pomożemy. – Taryn

+2

+1 Ten predykat w klauzuli WHERE neguje "zewnętrzną" wartość LEFT JOIN. Najprostszym sposobem, aby pomyśleć o sprzężeniu OUTER, jest to, że: jeśli pasujący wiersz nie zostanie znaleziony, generowany jest fałszywy wiersz, tak że istnieje pasujący wiersz do zwrócenia. Wygenerowany wiersz manekina będzie składał się całkowicie z wartości NULL. Zatem każdy predykat "NIE JEST NULL" w klauzuli WHERE wykluczy wszystkie te fałszywe wiersze, które zostały wygenerowane. – spencer7593

2

Korzystając

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; 

klauzuli WHERE używany wcześniej w zapytaniu "consultant_memberships_list.consultant_id = 5" został zaniedbując lewe sprzężenie zewnętrzne .

+1

Pomocne może być, jeśli wspomniano o zmianie wprowadzonej w zapytaniu (tj. Przeniesieniu predykatu z klauzuli WHERE do klauzuli ON) oraz wzmianki o tym, dlaczego taka zmiana jest konieczna. – spencer7593