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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top