SELEZIONA * DOVE NON ESISTE


94

Penso di andare sulla strada giusta con questo ... Per favore, abbi pazienza perché il mio SQL non è il massimo

Sto cercando di interrogare un database per selezionare tutto da una tabella in cui alcune celle non esistono in un'altra. Non ha molto senso, ma spero che questo pezzo di codice lo farà

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

Quindi fondamentalmente ho una tabella con un elenco di dipendenti e i 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 ci sono voci per loro, vorrei vedere esattamente chi sono o, in altre parole, vedere cosa manca esattamente.

La query sopra non restituisce nulla, ma so che mancano 20 nomi, quindi ovviamente non ho capito bene.

Qualcuno può aiutare?

Risposte:


160

Non ti sei unito al tavolo nella tua query.

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

Supponendo che queste tabelle debbano essere unite employeeID, utilizzare quanto segue:

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

Puoi unire queste tabelle con una LEFT JOINparola chiave e filtrare le NULL, ma questo sarà probabilmente meno efficiente dell'utilizzo NOT EXISTS.


30
Ho bisogno di "DOVE NON ESISTE" due volte all'anno e dimentico sempre come usarlo esattamente. Grazie - questo esempio verrà aggiunto ai segnalibri ora.
Mateng

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

2
@ toni07 In realtà, questa è una leggenda. LEFT JOIN vince. spiegatextended.com/2009/09/18/… .. Il blog di Quassnoi è sempre una risorsa utile.
Kaii

come lo userei in una clausola HAVING? akagroup by X having exist [row with employeeID = e.id]
phil294

@blauhirn: proprio così
Quassnoi

83
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

1
NB! NOT INnon funziona come previsto se nameha nullvalori. Guarda da 36 minuti e 20 secondi nel video SESSIONE: 10 tecniche di ottimizzazione delle query che ogni programmatore SQL dovrebbe conoscere (Kevin Kline, Aaron Bertrand) .
hlovdal

12

Puoi fare un LEFT JOIN 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

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

Non restituisce mai alcun record a meno che non eotm_dynsia vuoto. Hai bisogno di una sorta di criteri su SELECT name FROM eotm_dyncome

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

supponendo che le due tabelle siano collegate da una relazione di chiave esterna. A questo punto è possibile utilizzare una varietà di altre opzioni tra cui un LEFT JOIN. Tuttavia, l'ottimizzatore in genere li gestirà allo stesso modo nella maggior parte dei casi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.