SELECT * WO NICHT EXISTIERT

94

Ich denke, ich gehe mit diesem den richtigen Weg ... Bitte nehmen Sie mit, da mein SQL nicht das beste ist

Ich versuche, eine Datenbank abzufragen, um alles aus einer Tabelle auszuwählen, in der bestimmte Zellen in einer anderen nicht vorhanden sind. Das macht nicht viel Sinn, aber ich hoffe, dass dieser Code es tut

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

Im Grunde habe ich eine Tabelle mit einer Liste der Mitarbeiter und ihrer Details. Dann noch eine Tabelle mit einigen weiteren Details, einschließlich ihres Namens. Wo sich der Name nicht in der Tabelle eotm_dyn befindet, was bedeutet, dass für sie kein Eintrag vorhanden ist, möchte ich genau sehen, wer sie sind, oder mit anderen Worten, was genau fehlt.

Die obige Abfrage gibt nichts zurück, aber ich weiß, dass 20 Namen fehlen, also habe ich es offensichtlich nicht richtig verstanden.

Kann jemand helfen?

Ciaran
quelle

Antworten:

160

Sie haben die Tabelle in Ihrer Abfrage nicht verknüpft.

Ihre ursprüngliche Abfrage gibt immer nichts zurück, es sei denn, es sind überhaupt keine Datensätze vorhanden eotm_dyn. In diesem Fall wird alles zurückgegeben.

Angenommen, 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 einem LEFT JOINSchlüsselwort verknüpfen und die NULL's herausfiltern. Dies ist jedoch wahrscheinlich weniger effizient als die Verwendung NOT EXISTS.

Quassnoi
quelle
30
Ich brauche zweimal im Jahr "WHERE NOT EXISTS" und vergesse immer, wie man es genau benutzt. Danke - dieses Beispiel wird jetzt mit einem Lesezeichen versehen.
Mateng
1
Könnte jemand bitte eine Referenz für "LEFT JOIN + NULL Filter ist weniger effizient als NOT EXISTS" geben? Es kann offensichtlich sein, aber das habe ich in den Dokumenten nie gesehen. Vielen Dank.
Toni07
2
@ toni07 Eigentlich ist das eine Legende. LEFT JOIN gewinnt. explainextended.com/2009/09/18/… .. Quassnois Blog ist immer eine hilfreiche Ressource.
Kaii
Wie würde ich dies in einer HAVING-Klausel verwenden? akagroup by X having exist [row with employeeID = e.id]
phil294
@blauhirn: einfach so
Quassnoi
82
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
Robin Day
quelle
1
NB! NOT INnicht wie erwartet funktionieren , wenn namehat nullWerte. Sehen Sie sich das Video ab 36 Minuten und 20 Sekunden an. SESSION: 10 Techniken zur Optimierung von Abfragen, die jeder SQL-Programmierer kennen sollte (Kevin Kline, Aaron Bertrand) .
Hlovdal
12

Sie können LEFT JOIN ausführen und bestätigen, dass 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
Mike Tunnicliffe
quelle
7
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

Gibt niemals Datensätze zurück, es eotm_dynsei denn, diese sind leer. Sie müssen eine Art von Kriterien auf SELECT name FROM eotm_dynwie

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

Angenommen, die beiden Tabellen sind durch eine Fremdschlüsselbeziehung verbunden. Zu diesem Zeitpunkt können Sie eine Vielzahl anderer Optionen verwenden, einschließlich eines LEFT JOIN. Das Optimierungsprogramm behandelt sie jedoch in den meisten Fällen in der Regel gleich.

Cade Roux
quelle
4

Sie können sich auch diese verwandte Frage ansehen . Dieser Benutzer berichtete, dass die Verwendung eines Joins eine bessere Leistung bietet als die Verwendung einer Unterabfrage.

Andre Miller
quelle