requete imbrique <> all - SQL/NoSQL - Programmation
Marsh Posté le 14-11-2007 à 15:33:14
Code :
|
Marsh Posté le 14-11-2007 à 16:53:23
Si tu regardes dans ma signature, il y a un pavé sur les jointures à un endroit, qui donne une solution alternative en passant par un LEFT OUTER JOIN. Cette solution est moins lisible, mais plus rapide.
PS pour anapajari : select null from ... dans la sous-requête, c'est un peu mieux que d'appeler un champ de la table, puisqu'on n'a pas besoin de le connaître avec NOT EXISTS. Ou alors mets NOT IN à la place
Marsh Posté le 14-11-2007 à 16:53:32
c est aussi long (avec NOT EXISTS)
Marsh Posté le 14-11-2007 à 17:13:43
MagicBuzz a écrit : PS pour anapajari : select null from ... dans la sous-requête, c'est un peu mieux que d'appeler un champ de la table, puisqu'on n'a pas besoin de le connaître avec NOT EXISTS. Ou alors mets NOT IN à la place |
NOT IN ça suxxe.
Pour le null je suis pas forcément d'accord car AMA s'il y a un index sur clef_personne ça va plus vite d'utiliser le champs.
JulienOrion666 a écrit : c est aussi long (avec NOT EXISTS) |
Ne manquerait-il pas des indexs dans ta base?
S'ils y sont, runstats/reorg?
Marsh Posté le 14-11-2007 à 18:05:42
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 :
|
C'est sémantiquement :
Code :
|
(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
Marsh Posté le 14-11-2007 à 15:11:19
Bonjour,
Je voudrais selectioner toute les personne ne faisait pas partie d'une liste retourné par une requete (le contraire de IN en sorte toutes les personne qui ne sont PAS dans la liste.
J'ai fait cette requette :
"SELECT * FROM Personnes WHERE clef <> ALL (SELECT distinct clef_personne FROM carriere WHERE Profession <> 12 ) ) "
ca marche mais c'est extremement long y a t'il un autre moyen de proceder.