Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql SELECT NOT IN () -- ensemble disjoint ?

Vous devez utiliser n'existe pas :

SELECT DISTINCT a, b, c FROM t1 WHERE NOT EXISTS (SELECT NULL FROM t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)

L'utilisation de NOT IN n'est pas la meilleure méthode pour ce faire, même si vous ne cochez qu'une seule clé. La raison en est que si vous utilisez NOT EXISTS, le SGBD n'aura qu'à vérifier les index si des index existent pour les colonnes nécessaires, alors que pour NOT IN, il devra lire les données réelles et créer un ensemble de résultats complet qui devra ensuite être vérifié. .

Utiliser un LEFT JOIN puis vérifier NULL est également une mauvaise idée, ce sera très lent lorsque les tables sont grandes car la requête doit faire la jointure entière, lire les deux tables entièrement et ensuite en jeter une grande partie. De plus, si les colonnes autorisent les valeurs NULL, la vérification de NULL rapportera des faux positifs.