Question

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 leur 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 dois-je procéder?

Était-ce utile?

La solution

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 à une colonne de la deuxième table.Vous avez également mentionné que vous ne voulez 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.

Autres conseils

Je pense que l'utilisation de 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)

La requête souhaitée doit ressembler à ceci.Notez qu'un JOIN sera nettement 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
SELECT 
  name,
  id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top