Le lien de Joe est un bon point de départ. Quassnoi couvre cela aussi.
En général, si vos champs sont correctement indexés, OU si vous prévoyez de filtrer plus d'enregistrements (c'est-à-dire avoir beaucoup de lignes EXIST
dans la sous-requête) NOT EXISTS
fonctionnera mieux.
EXISTS
et NOT EXISTS
les deux court-circuit - dès qu'un enregistrement correspond aux critères, il est soit inclus, soit filtré et l'optimiseur passe à l'enregistrement suivant.
LEFT JOIN
rejoindra TOUS LES RECORDS indépendamment du fait qu'ils correspondent ou non, puis filtrez tous les enregistrements qui ne correspondent pas. Si vos tables sont grandes et/ou vous avez plusieurs JOIN
critères, cela peut être très gourmand en ressources.
J'essaie normalement d'utiliser NOT EXISTS
et EXISTS
lorsque c'est possible. Pour SQL Server, IN
et NOT IN
sont sémantiquement équivalents et peuvent être plus faciles à écrire. Ce sont parmi les seuls opérateurs que vous trouverez dans SQL Server qui sont garantis contre les courts-circuits.