2009-05-27 22 views
67

penso di andare giù la strada giusta con questo ... Si prega di portare con me come il mio SQL non è il massimoSELECT * DOVE NON ESISTE

Sto cercando di interrogare un database per selezionare tutto da una tabella in cui alcune celle non esistono in un'altra. Che molto non fare un sacco di senso, ma spero questo pezzo di codice

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn) 

Quindi, fondamentalmente ho una tabella con l'elenco dei dipendenti e dei loro dettagli. Poi un'altra tabella con altri dettagli, incluso il loro nome. Dove il nome non è nella tabella eotm_dyn, il che significa che non c'è una voce per loro, mi piacerebbe vedere esattamente chi sono, o in altre parole, vedere cosa manca esattamente.

La query sopra riportata non restituisce nulla, ma so che mancano i nomi 20ish quindi ovviamente non ho ottenuto il risultato giusto.

Qualcuno può aiutare?

risposta

105

Non hai partecipato alla tabella della query.

La query originale restituirà sempre nulla, a meno che non ci siano record in eotm_dyn, nel qual caso restituirà tutto.

Assumendo queste tabelle devono essere uniti su employeeID, utilizzare il seguente:

SELECT * 
FROM employees e 
WHERE NOT EXISTS 
     (
     SELECT null 
     FROM eotm_dyn d 
     WHERE d.employeeID = e.id 
     ) 

È possibile unire queste tabelle con un LEFT JOIN parola chiave e filtrare i NULL 's, ma questo sarà probabilmente meno efficiente rispetto all'utilizzo NOT EXISTS.

+21

Ho bisogno di "DOVE NON ESISTE" due volte all'anno, e ho sempre dimenticato come usarlo esattamente. Grazie - questo esempio verrà contrassegnato come preferito. – Mateng

+1

Qualcuno potrebbe fornire un riferimento per "LEFT JOIN + Il filtro NULL è meno efficiente di NOT EXISTS"? Può essere ovvio, ma non l'ho mai visto nei documenti. Grazie. – toni07

+1

@ toni07 In realtà, questa è una leggenda. LEFT JOIN vince.https://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ .. Il blog di Quassnoi è sempre una risorsa utile. – Kaii

11

È possibile eseguire un SINISTRA SINISTRO e affermare che la colonna unita è NULL.

Esempio:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL 
68
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn) 

O

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name) 

O

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL 
+0

NB! 'NOT IN' non funziona come previsto se' name'has 'null'values. Guarda da 36 minuti e 20 secondi nel video [SESSION: 10 tecniche di ottimizzazione delle query che ogni programmatore SQL dovrebbe conoscere (Kevin Kline, Aaron Bertrand)] (https://www.youtube.com/watch?v=XUCxQkFoqpw). – hlovdal

6
SELECT * from employees 
WHERE NOT EXISTS (SELECT name FROM eotm_dyn) 
Mai

restituisce tutti i record a meno che eotm_dyn è vuoto. Hai bisogno di un qualche tipo di criteri sulla SELECT name FROM eotm_dyn come

SELECT * from employees 
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid 
) 

assumendo che le due tabelle sono collegate da una relazione di chiave esterna. A questo punto è possibile utilizzare una varietà di altre opzioni tra cui un SINISTRA SINISTRA. L'ottimizzatore in genere li gestirà allo stesso modo nella maggior parte dei casi, comunque.

4

Puoi anche dare un'occhiata a this related question. Quell'utente ha segnalato che l'utilizzo di un join ha fornito prestazioni migliori rispetto all'utilizzo di una query secondaria.

Problemi correlati