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 :

Sous-requête ou jointure


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 431
    Points : 0
    Points
    0
    Par défaut Sous-requête ou jointure
    Bonjour,

    Est-ce que toute sous requête peut être representée par une jointure de tables ?

    Merci d'avance

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2009
    Messages : 73
    Points : 160
    Points
    160
    Par défaut
    Sous-requête ou imbrication
    Une sous-requête est une requête à l'intérieur d'une autre. Avec le langage SQL, vous pouvez écrire des requêtes imbriquées sur autant de niveaux tout comme vous pouvez également mélanger jointures et sous-requêtes. Une requête peut être aussi complexe que vous le voulez tant qu'elle reste correcte.

    Certains préfèrent les sous-requêtes aux jointures pour la simplicité du code, sauf qu'elles peuvent être moins rapide à l'exécution.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 898
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par s2a07 Voir le message
    Bonjour,

    Est-ce que toute sous requête peut être representée par une jointure de tables ?

    Merci d'avance
    Non !

    Soyons logique, si l'on a inventé les sous requêtes, c'est parce qu'elle servent à quelque chose.

    Certaines sous requêtes peuvent être remplacer par des jointures, mais pas toutes !

    L'exemple typique est la recherche de tuple(s) ayant une caractéristique à un point particulier (extrémum, médiane, moyenne...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM   UnEnsembleDeDonnées
    WHERE  UneCaractéristique = (SELECT MAX(UneCaractéristique) 
                                 FROM   UnEnsembleDeDonnées)
    Pour vous former au SQL, lisez le livre que j'ai écrit :
    Nom : Couverture SQL Synthex 4e ed - 500.jpg
Affichages : 1080
Taille : 77,8 Ko


    A +

  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
    en l’occurrence, on peut le remplacer par une jointure externe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.*
    FROM UnEnsembleDeDonnées AS A
    LEFT OUTER JOIN UnEnsembleDeDonnées AS B
        ON B.UneCaractéristique > A.UneCaractéristique
    WHERE B.UneCaractéristique IS NULL
    (ou même une fonction fenêtrée mais ce n'est pas l'objet du débat...)

    Je dirai que toutes les sous-requêtes servant de restriction peuvent en effet être remplacées par des jointures (pas forcément mieux au niveau perfs toutefois)

    En revanche, pour ce qui est des sous-requêtes en table dérivée, ce n'est pas toujours possible.

    Par exemple à une sous-requête qui fait un UNION, ou plusieurs sous-requête qui font des agrégats

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 108
    Points : 28 415
    Points
    28 415
    Par défaut
    Une sous-requête utilisée avec IN ou EXISTS ne peut pas toujours être remplacé par une jointure, en particulier avec des relations 0,1-N.

  6. #6
    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
    en effet...

    Ou alors, remplacer par une jointure sur... une sous-requête en table dérivée

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 898
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    en l’occurrence, on peut le remplacer par une jointure externe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.*
    FROM UnEnsembleDeDonnées AS A
    LEFT OUTER JOIN UnEnsembleDeDonnées AS B
        ON B.UneCaractéristique > A.UneCaractéristique
    WHERE B.UneCaractéristique IS NULL
    (ou même une fonction fenêtrée mais ce n'est pas l'objet du débat...)

    Je dirai que toutes les sous-requêtes servant de restriction peuvent en effet être remplacées par des jointures (pas forcément mieux au niveau perfs toutefois)

    En revanche, pour ce qui est des sous-requêtes en table dérivée, ce n'est pas toujours possible.

    Par exemple à une sous-requête qui fait un UNION, ou plusieurs sous-requête qui font des agrégats
    Ben non, tu ne trouvera pas le MAX avec ça...

    A +

  8. #8
    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
    Pourquoi donc ? j'ai loupé quelque chose ?

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 898
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Tu trouvera toutes les valeurs supérieures et non la plus grande.

    A +

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 431
    Points : 0
    Points
    0
    Par défaut
    merci mais ce n'est pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.*
    FROM UnEnsembleDeDonnées AS A
    LEFT OUTER JOIN UnEnsembleDeDonnées AS B
        ON A.UneCaractéristique > B.UneCaractéristique
    WHERE B.UneCaractéristique IS NULL
    ou bien dans le where stocker dans une liste et prendre le max

  11. #11
    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
    Citation Envoyé par SQLpro Voir le message
    Tu trouvera toutes les valeurs supérieures et non la plus grande.

    A +
    bah non, elles seront filtrées par le WHERE B.UneCaractéristique IS NULL

  12. #12
    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
    Citation Envoyé par s2a07 Voir le message
    merci mais ce n'est pas plutôt...
    Non,

    L'idée est de chercher les valeurs plus grandes, et de ne garder que les lignes pour lesquelles ont n'en a pas trouvé : les lignes pour lesquelles il n'existe pas de valeur plus grande, sont les lignes ayant la valeur max.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 431
    Points : 0
    Points
    0
    Par défaut
    merci j'enlève
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B.UneCaractéristique IS NULL
    et dans ce where après avoir stoker dans une varriable un liste je prends le max de cette liste
    merci d'avance

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 898
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par s2a07 Voir le message
    merci mais ce n'est pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.*
    FROM UnEnsembleDeDonnées AS A
    LEFT OUTER JOIN UnEnsembleDeDonnées AS B
        ON A.UneCaractéristique > B.UneCaractéristique
    WHERE B.UneCaractéristique IS NULL
    ou bien dans le where stocker dans une liste et prendre le max

    Il faudrait faire un SELECT DISTINCT A.* pour éviter des doublons... et ce sera presque équivalent... Mais pas tout à fait !!!!

    À vous de voir pourquoi...

    A +

Discussions similaires

  1. Transformer une sous requête en jointure.
    Par ithurts dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/06/2010, 00h26
  2. Réponses: 3
    Dernier message: 25/05/2009, 17h11
  3. Performance - Sous requête ou jointure
    Par Shivan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/12/2008, 16h06
  4. Sous-requêtes VS jointures ?
    Par Evocatii dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/03/2008, 13h57
  5. sous requêtes et jointures externes
    Par Harpoon dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/05/2007, 19h43

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