133 votes

SÉLECTIONNEZ * OÙ N'EXISTE PAS

Je pense que je suis sur la bonne voie avec celui-ci... s'il vous Plaît garder avec moi, comme mes SQL n'est pas le plus grand

Je suis en train d'interroger une base de données pour sélectionner tous les éléments d'un tableau où certaines cellules n'existent pas dans l'autre. Que beaucoup ne fait pas beaucoup de sens, mais je suis en espérant que ce morceau de code

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

Donc en gros j'ai une table avec une liste des employés et de leurs détails. Puis une autre table avec quelques autres détails, y compris leur nom. Où il y a le nom n'est pas dans le eotm_dyn table, il n'y a pas d'entrée pour eux, je voudrais voir exactement qui ils sont, ou en d'autres termes, de voir exactement ce que est manquant.

La requête ci-dessus ne retourne rien, mais je sais qu'il y a 20ish noms manquants donc je n'ai évidemment pas eu le droit.

Quelqu'un peut-il aider?

198voto

Quassnoi Points 191041

Vous n'avez pas à rejoindre la table dans votre requête.

L'original de votre requête retournera toujours rien moins qu'il n'existe pas de registres à tous, en eotm_dyn, auquel cas il sera de retour tout.

En supposant que ces tables doivent être jointes sur employeeID, utilisez la commande suivante:

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 LEFT JOIN de mots clés et de filtrer l' NULLs', mais ce sera certainement moins efficace que l'utilisation d' NOT EXISTS.

93voto

Robin Day Points 39440
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

13voto

fd. Points 6835

Vous pouvez faire un LEFT JOIN et de faire valoir la rejoint colonne est NULL.

Exemple:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL

9voto

Cade Roux Points 53870
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

Jamais renvoie tous les enregistrements sauf eotm_dyn est vide. Vous avez besoin d'un certain genre 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 pourriez utiliser une variété d'autres options, y compris un LEFT JOIN. L'optimiseur gère généralement les mêmes dans la plupart des cas, cependant.

4voto

Andre Miller Points 6713

Vous pouvez également jeter un oeil à cette question. Cet utilisateur a signalé que l'utilisation d'une jointure fourni de meilleures performances que d'utiliser une sous-requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X