2013-02-13 16 views
5

Il mio obiettivo è di fare esattamente ciò che un LEFT OUTER JOIN intende fare usando il diagramma di Venn 4 °: SQL Diagrams:LEFT OUTER JOIN query non ritorno righe previste

enter image description here

La mia domanda non restituisce alcun valore del tutto, dove in effetti dovrebbe tornare tutto all'interno del Consultant_Memberships meno quello memorizzato all'interno di Consultant_Memberships_Lists.

prega di consultare il SQL Fiddle per una più facile comprensione:

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 

La query sta usando '5' da un ID per scopi dimostrativi per cercare di individuare le righe corrette.

+1

Attualmente la tua domanda non ha quasi nessuna informazione, solo collegamenti a informazioni altrove. Questi collegamenti vanno bene, ma la tua domanda dovrebbe contenere anche le informazioni necessarie. – ruakh

+1

(Inoltre, il tuo fraseggio - "in effetti, [la mia query] dovrebbe essere [...]" - fa sembrare che tu pensi di aver scritto correttamente la query, e il DBMS sta semplicemente scorrendo. assicurati, non è così.) – ruakh

+0

(concordo con ruakh. Ho cambiato "corretto" in "atteso" nel titolo, e incoraggio l'uso di un linguaggio neutro/non accusatorio.) –

risposta

13

La query corrente sta fondamentalmente facendo un INNER JOIN a causa dello consultant_id = 5 nella clausola WHERE. Credo che in realtà si vuole utilizzare:

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; 

Vedi SQL Fiddle with Demo

+0

@Bluefeet - Funziona perfettamente e ho imparato di più dal LEFT OUTER JOIN nel processo. Grazie per il tuo aiuto, lo apprezzo. – Ben

+1

@Svengali siete i benvenuti, felici di aiutare. – Taryn

+2

+1 Questo predicato nella clausola WHERE sta annullando l'aspetto "esterno" di LEFT JOIN. Il modo più semplice per me di pensare al join OUTER è questo: se non viene trovata una riga corrispondente, viene generata una riga fittizia in modo che ci sia una riga corrispondente da restituire. Quella riga fittizia generata sarà composta interamente da valori NULL. Quindi qualsiasi predicato "IS NOT NULL" nella clausola WHERE sta per escludere tutte quelle file fittizie che sono state generate. – spencer7593

2

Usa

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; 

La clausola Where usato prima nella query "consultant_memberships_list.consultant_id = 5" è stato trascurare il join esterno sinistro .

+1

Potrebbe essere più utile se hai menzionato quale modifica hai apportato alla query (ad esempio spostando un predicato da una clausola WHERE a una clausola ON) e una menzione del motivo per cui tale modifica è necessaria. – spencer7593

Problemi correlati