web-dev-qa-db-fra.com

Vérifier si un élément n'existe pas dans une autre table

Mes tables sont configurées comme ceci:

table name: process
fields: name, id_string

table name: value_seach
fields: id_string, value

Je veux construire une instruction select qui affichera tous les noms de processus (avec son id_string respectif) qui n'ont pas d'entrée dans value_search.

La chaîne id_string dans la table de processus peut être null et avoir toujours un nom, mais ceux-ci doivent être exclus si possible. La chaîne id_string dans value_search ne peut jamais être null

Comment puis-je faire cela?

27
user906153

En général, si vous voulez des lignes qui n'existent pas dans une autre table, alors LEFT JOIN l'autre table et WHERE ... IS NULL dans une colonne de la deuxième table. Vous avez également mentionné que vous ne veulent pas de lignes où process.id_string est NULL.

SELECT p.name, p.id_string
FROM
    process p
    LEFT JOIN value_search v
        ON v.id_string = p.id_string
WHERE
    v.id_string IS NULL
    AND p.id_string IS NOT NULL

C'est ce qu'on appelle une anti-jointure.

41
zgpmax

Je crois qu'en utilisant Not Exists serait votre meilleure option ici.

SELECT p.name, p.id_string
FROM process p
WHERE 
   NOT p.id_string IS NULL AND
   NOT EXISTS(
          SELECT NULL
          FROM value_search v
          WHERE p.id_string = v.id_string)
27
Magnus

La requête que vous souhaitez devrait ressembler à ceci. Notez qu'un JOIN sera beaucoup plus rapide qu'une sous-requête dans la clause WHERE.

SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
   ON p.id_string = v.id_string
   AND p.id_string IS NOT NULL
   AND v.id_string IS NULL

Une variante tout aussi valide de la requête ci-dessus serait:

SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
   ON p.id_string = v.id_string
WHERE
   p.id_string IS NOT NULL
   AND v.id_string IS NULL
4
Brian Driscoll
SELECT 
  name,
  id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach
2
alexsuslin