Frage
Ich denke, dass ich damit auf dem richtigen Weg bin ...Bitte haben Sie Geduld, da mein SQL nicht der Beste ist
Ich versuche, eine Datenbank abzufragen, um alles aus einer Tabelle auszuwählen, in der bestimmte Zellen in einer anderen nicht vorhanden sind.So viel ergibt zwar keinen großen Sinn, aber ich hoffe, dass dieser Code einen Sinn ergibt
SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
Im Grunde habe ich also eine Tabelle mit einer Liste der Mitarbeiter und deren Details.Dann eine weitere Tabelle mit einigen anderen Details, einschließlich ihres Namens.Wenn der Name nicht in der Tabelle eotm_dyn steht, also kein Eintrag für sie vorhanden ist, möchte ich genau sehen, wer sie sind, oder mit anderen Worten, sehen, was genau fehlt.
Die obige Abfrage gibt nichts zurück, aber ich weiß, dass etwa 20 Namen fehlen, also habe ich es offensichtlich nicht richtig verstanden.
Kann jemand helfen?
Lösung
Sie haben der Tabelle in Ihrer Anfrage nicht beigetreten.
Ihre ursprüngliche Abfrage wird immer nichts zurückgeben, es sei denn, es sind überhaupt keine Datensätze vorhanden eotm_dyn
, in diesem Fall wird alles zurückgegeben.
Vorausgesetzt, diese Tabellen sollten verknüpft werden employeeID
, verwenden Sie Folgendes:
SELECT *
FROM employees e
WHERE NOT EXISTS
(
SELECT null
FROM eotm_dyn d
WHERE d.employeeID = e.id
)
Sie können diese Tabellen mit a verbinden LEFT JOIN
Schlüsselwort und filtern Sie das heraus NULL
's, aber das wird wahrscheinlich weniger effizient sein als die Verwendung NOT EXISTS
.
Andere Tipps
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)
oder
SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)
oder
SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL
Sie können eine LEFT JOIN tun und behaupten, die verknüpfte Spalte NULL ist.
Beispiel:
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)
gibt nie irgendwelche Aufzeichnungen, es sei denn eotm_dyn
leer. Sie müssen irgendeine Art von Kriterien auf SELECT name FROM eotm_dyn
wie
SELECT * from employees
WHERE NOT EXISTS (
SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)
unter der Annahme, dass die beiden Tabellen, die von einer Fremdschlüsselbeziehung verknüpft sind. An dieser Stelle können Sie eine Vielzahl von anderen Optionen verwenden, um einen LEFT JOIN mit. Der Optimierer wird sie in der Regel übernimmt die gleiche in den meisten Fällen jedoch.
Sie können auch einen Blick auf diese Frage im Zusammenhang . Dieser Benutzer berichtete, dass eine Join zur Verfügung gestellt bessere Leistung unter Verwendung als eine Sub-Abfrage verwendet wird.