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?
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.
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)
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
SELECT
name,
id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach