IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

select in (select in (select in etc.))


Sujet :

Langage SQL

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 384
    Points
    1 384
    Par défaut select in (select in (select in etc.))
    Bonjour,

    Je reprends du code où les requêtes sont de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select A1 from A 
    where A2 in 
    (select B1 from B where B2 in 
        (select C1 from C where C2 = xxx)
    )
    N'est-ce pas l'équivalent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select A1 
    from A, B, C
    where A2 = B1 and B2 = C1 and C2 = xxx
    Si le résultat est le même, une des deux requêtes est-elle plus performante ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 242
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    Pour moi les deux requêtes sont équivalentes, mais uniquement si on apporte une petite modification:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select distinct A1 
    from A
    inner join B on a.A2 = b.B1 
    inner join  C on b.B2 = c1C1
    where C2 = xxx

    Toujours pour moi, la deuxième est préférable, car le moteur a plus de latitude pour optimiser la requête, l'ordre des tables n'étant plus imposé.

    Tatayo.

    P.S. j'en ai profité pour réécrire les jointures, et préfixer les colonnes avec le nom des tables. C'est mon côté chieur

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 384
    Points
    1 384
    Par défaut
    Merci, même (surtout) pour le côté chieur.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    NON !!!

    Aucune de ces trois requêtes n'est équivalente, même si elles peuvent donner les mêmes résultats dans certains cas.

    Si on prend ce jeu d'essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE A(	A1 INT	,A2 INT);
    CREATE TABLE B(	B1 INT	,B2 INT);
    CREATE TABLE C(	C1 INT	,C2 INT);
     
    INSERT INTO A VALUES(1,1), (1,1), (2,1)
    INSERT INTO B VALUES(1,1),(1,2)
    INSERT INTO C VALUES (1,5), (2,5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select A1 from A 
    where A2 in 
    (select B1 from B where B2 in 
        (select C1 from C where C2 = 5)
    );
    A1
    -----------
    1
    1
    2
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select A1 
    from A, B, C
    where A2 = B1 and B2 = C1 and C2 = 5;
    A1
    -----------
    1
    1
    1
    1
    2
    2
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select distinct A1 
    from A
    inner join B on a.A2 = b.B1 
    inner join  C on b.B2 = C1
    where C2 = 5
    A1
    -----------
    1
    2
    
    Vous pouvez en revanche réduire le nombre d'imbrications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select A1 
    from A
    WHERE A2 IN (
    	select b.B1 
    	from B
    	inner join  C 
    		on b.B2 = C1
    	where C2 = 5
    )
    Ou utiliser EXISTS.

    D'autres écritures sont également possibles.

    Quant à l'impact sur les performances, cela dépendra entre autres des index disponibles, et des données dans vos tables (volumétrie, répartition), le mieux étant donc de tester.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 384
    Points
    1 384
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    NON !!!

    Aucune de ces trois requêtes n'est équivalente, même si elles peuvent donner les mêmes résultats dans certains cas.
    [...]

    Quant à l'impact sur les performances, cela dépendra entre autres des index disponibles, et des données dans vos tables (volumétrie, répartition), le mieux étant donc de tester.
    Merci pour ces précisions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. Réponses: 6
    Dernier message: 20/07/2006, 10h51
  3. <select value="1">1</select>
    Par picsoun dans le forum Langage
    Réponses: 6
    Dernier message: 18/03/2006, 01h34
  4. [TStringGrid] Masquer la sélection
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 3
    Dernier message: 31/05/2004, 15h26
  5. [struts][JSP][select] problème avec le select
    Par redge_touch dans le forum Struts 1
    Réponses: 4
    Dernier message: 14/01/2004, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo