Question

Je pense que je vais sur le droit chemin avec celui-ci ... S'il vous plaît garder avec moi que mon SQL est pas le plus grand

Je suis en train d'interroger une base de données pour sélectionner tout d'une table où certaines cellules n'existent pas dans un autre. Ce bien ne fait pas beaucoup de sens, mais j'espère que ce morceau de code

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

Donc, fondamentalement, j'ai une table avec une liste des employés et leurs coordonnées. Ensuite, une autre table avec quelques autres détails, y compris leur nom. Là où il y a le nom n'est pas dans la table eotm_dyn, signifie qu'il n'y a pas d'entrée pour eux, je voudrais voir exactement qui ils sont, ou en d'autres termes, voir ce qui manque exactement.

La requête ci-dessus renvoie rien, mais je sais qu'il ya des noms manquants 20ish donc je l'ai évidemment pas eu ce droit.

Quelqu'un peut-il aider?

Était-ce utile?

La solution

Vous ne l'avez pas joindre à la table dans votre requête.

Votre requête initiale retourne toujours rien à moins qu'il n'y a pas du tout dans les dossiers eotm_dyn, auquel cas il va tout retour.

En supposant que ces tables doivent être jointes à employeeID, utilisez les touches suivantes:

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

Vous pouvez joindre ces tables avec un mot-clé LEFT JOIN et filtrer les années NULL, mais ce sera probablement moins efficace que l'utilisation NOT EXISTS.

Autres conseils

SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

ou

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

ou

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL

Vous pouvez faire un LEFT JOIN et affirmer la colonne jointe est NULL.

Exemple:

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)

Ne retourne tous les enregistrements sauf si eotm_dyn est vide. Vous avez besoin d'une certaine sorte de critères sur SELECT name FROM eotm_dyn comme

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

en supposant que les deux tables sont liées par une relation de clé étrangère. À ce stade, vous pouvez utiliser une variété d'autres options, y compris LEFT JOIN. L'optimiseur généralement les traiter de la même dans la plupart des cas, cependant.

Vous pouvez également consulter cette question connexe. Cet utilisateur a signalé que l'utilisation d'une jointure fourni de meilleures performances que d'utiliser une sous requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top