Domanda
Credo che sto andando verso il basso la strada giusta con questo ... Si prega di portare con me come il mio SQL non è il massimo
Sto cercando di interrogare un database per selezionare tutto da una tabella in cui non esistono alcune cellule in un altro. 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 altro tavolo con alcuni altri dettagli, compreso il loro nome. Dove c'è nome non è nella tabella eotm_dyn, significa che non c'è alcuna voce per loro, mi piacerebbe vedere esattamente chi sono, o in altre parole, vedere che cosa esattamente che manca.
La query sopra restituisce nulla, ma so che ci sono 20ish nomi mancanti così ho ottenuto, ovviamente, non è giusto.
Chiunque può aiutare?
Soluzione
non ha aderito al tavolo nella query.
La vostra query originale sarà sempre tornare nulla se non ci sono record a tutti in eotm_dyn
, nel qual caso verrà restituito tutto.
Supponendo che queste tabelle dovrebbe essere raggiunto sul 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 una parola chiave LEFT JOIN
e filtrare il NULL
di, ma questo sarà probabilmente meno efficiente rispetto all'utilizzo di NOT EXISTS
.
Altri suggerimenti
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
Si può fare un LEFT JOIN e affermare la colonna unito è NULL.
Esempio:
SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
Non 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
)
partendo dal presupposto 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 LEFT JOIN. L'ottimizzatore in genere gestirli la stessa nella maggior parte dei casi, tuttavia.
Si può anche dare un'occhiata a questo riguardo, la domanda . Questo utente ha segnalato che l'utilizzo di un join migliore prestazione fornita rispetto all'utilizzo di una query sub.