Il y a essentiellement 3 approches pour cela : not exists
, not in
y left join / is null
.
JOINT GAUCHE avec IS NULL
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
PAS DANS
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
N'EXISTE PAS
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
Laquelle est la meilleure ? Pour répondre à cette question, il serait peut-être préférable de s'adresser aux principaux fournisseurs de SGBDR. D'une manière générale, il faut éviter d'utiliser select ... where ... in (select...)
lorsque l'ordre de grandeur du nombre d'enregistrements dans la sous-requête est inconnu. Certains fournisseurs peuvent limiter la taille. Oracle, par exemple, a une limite de 1 000 . La meilleure chose à faire est d'essayer les trois et de montrer le plan d'exécution.
Spécifiquement sous PostgreSQL, le plan d'exécution de NOT EXISTS
y LEFT JOIN / IS NULL
sont les mêmes. Je préfère personnellement le NOT EXISTS
option car elle montre mieux l'intention. Après tout, la sémantique est que vous voulez trouver des enregistrements dans A que son pk n'existent pas en B .
Vieux mais toujours doré, spécifique à PostgreSQL cependant : https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/
3 votes
Un conseil pour les questions futures : définissez toujours le système de base de données (et la version de cette base) que vous utilisez. SQL est juste le Langage d'interrogation structuré utilisé par la plupart des systèmes de bases de données - cela ne nous aide pas beaucoup ... souvent, les bases de données ont des extensions et des fonctionnalités qui vont bien au-delà de la norme ANSI/ISO SQL et qui permettent de résoudre facilement le problème - mais pour cela, vous devez nous dire quelle base de données vous utilisez.
7 votes
@marc_s : Et s'ils recherchent une solution agnostique au niveau du langage, parce qu'ils doivent prendre en charge plusieurs systèmes de base de données sous-jacents, ou que l'implémentation de la base de données est abstraite ?
0 votes
Bonjour @marc_s, j'utilise PostgreSQL dans ce cas. Merci de me le rappeler.