Julien > Et avec la solution du left join ?
Anapajari > Pour le NOT IN vs NOT EXISTS, c'est ce que j'ai cru longtemps grâce à la bouse infâme qu'est Oracle. En réalité, sur tous les SGBD (y compris Oracle 10g) le NOT IN est étrangement plus rapide (et de loin) que le NOT EXISTS.
Ensuite, non, de toute façon tu peux faire tout ce que tu veux dans ton sous-select, tout ce qui est compris entre "select" et "from" est complètement ignoré par le moteur SQL. En fait, l'utilisation de null au lieu d'un nom de champ, ça ne va pas impacter grand chose (l'interpréteur à la limite, quelques nanosecondes de gagnées avec null), mais surtout, je trouve ça moins confusant pour le relecteur : le filtre effectué par le NOT EXISTS ne porte pas du tout sur les valeur "sélectionnées", mais sur le fitre de la requête.
En fait, tu dois te dire dans ta tête que :
Code :
SELECT * FROM matable WHERE NOT EXISTS (SELECT trucmuche FROM machin WHERE machin.id = matable.id)
|
C'est sémantiquement :
Code :
SELECT * FROM matable WHERE (machin has_not_rows WHERE machin.id = matable.id)
|
(has_not_rows est évidement un statement purement inventé par moi)
Imagine que tu fait un "select nom" dans ta sous-requête, alors que ton filtre porte sur "id", le relecteur peut croire que tu filtres les noms existants au lieu des id existants. Alors que select null ou select 1, le gars il pige pas, donc lit la requête jusqu'au bout
Message édité par MagicBuzz le 14-11-2007 à 18:08:34