requete imbrique <> all

requete imbrique <> all - SQL/NoSQL - Programmation

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.

Reply

Marsh Posté le 14-11-2007 à 15:11:19   

Reply

Marsh Posté le 14-11-2007 à 15:33:14    

Code :
  1. SELECT * FROM Personnes WHERE NOT EXISTS ( SELECT clef_personne FROM carriere WHERE Profession<>12 AND clef_personne = clef)

Reply

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 ;)

Message cité 1 fois
Message édité par MagicBuzz le 14-11-2007 à 16:54:53
Reply

Marsh Posté le 14-11-2007 à 16:53:32    

c est aussi long :( (avec NOT EXISTS)

Message cité 1 fois
Message édité par JulienOrion666 le 14-11-2007 à 16:54:31
Reply

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?
 

Reply

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 :
  1. SELECT * FROM matable WHERE NOT EXISTS (SELECT trucmuche FROM machin WHERE machin.id = matable.id)


 
C'est sémantiquement :

Code :
  1. 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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed