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 :

Positionnement prédicat dans un LEFT OUTER JOIN


Sujet :

Langage SQL

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut Positionnement prédicat dans un LEFT OUTER JOIN
    Bonjour à tous,

    Je voudrais avoir votre avis sur le positionnement d'un prédicat pour une jointure externe, voici les deux syntaxes (qui sont à priori équivalente) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT NUM_ARTICLE, DATE_PARUTION, TEXT_COMMENTAIRE
    FROM ARTICLE as art
             LEFT OUTER JOIN COMMENTAIRE AS com ON art.ID = com.ARTICLE_ID
             AND com.IS_VALID = 1

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT NUM_ARTICLE, DATE_PARUTION, TEXT_COMMENTAIRE
    FROM ARTICLE as art
             LEFT OUTER JOIN COMMENTAIRE AS com ON art.ID = com.ARTICLE_ID
    WHERE (com.IS_VALID = 1 or com.ID is null)

    Quelle est votre avis ?

    (L'exemple a été simplifié pour illustrer mon propos, donc ne vous attardez pas dessus ;-) )

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Non les syntaxes ne sont pas équivalentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    With ARTICLE (ARTICLE_ID) as
    (
    select 1
    )
      ,  COMMENTAIRE (ARTICLE_ID, IS_VALID) as
    (
    select 1, 1 union all
    select 1, null 
    )
    SELECT art.ARTICLE_ID, com.IS_VALID 
      FROM ARTICLE AS art
           LEFT OUTER JOIN COMMENTAIRE AS com
             ON art.ARTICLE_ID = com.ARTICLE_ID
            AND com.IS_VALID = 1;
     
    ARTICLE_ID  IS_VALID
    ----------- -----------
    1           1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    With ARTICLE (ARTICLE_ID) as
    (
    select 1
    )
      ,  COMMENTAIRE (ARTICLE_ID, IS_VALID) as
    (
    select 1, 1 union all
    select 1, null 
    )
    SELECT art.ARTICLE_ID, com.IS_VALID 
      FROM ARTICLE AS art
           LEFT OUTER JOIN COMMENTAIRE AS com
             ON art.ARTICLE_ID = com.ARTICLE_ID
     WHERE com.IS_VALID = 1
        OR com.IS_VALID IS NULL;
     
    ARTICLE_ID  IS_VALID
    ----------- -----------
    1           1
    1           NULL

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 377
    Points : 1 628
    Points
    1 628
    Par défaut
    Merci pour votre réponse

    Quand vous avez retranscris la deuxième requête vous avez changé un peu la clause, les requêtes d'origine ressemblerai plutôt à cela, ce qui change tout au niveau des résultats :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    WITH ARTICLE (ARTICLE_ID) AS
    (
    SELECT 1 union all
    SELECT 2
    )
      ,  COMMENTAIRE (ARTICLE_ID, IS_VALID) AS
    (
    SELECT 1, 1 union ALL
    SELECT 1, NULL 
    )
    SELECT art.ARTICLE_ID, com.IS_VALID 
      FROM ARTICLE AS art
           LEFT OUTER JOIN COMMENTAIRE AS com
             ON art.ARTICLE_ID = com.ARTICLE_ID
            AND com.IS_VALID = 1;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    WITH ARTICLE (ARTICLE_ID) AS
    (
    SELECT 1 union all
    SELECT 2
    )
      ,  COMMENTAIRE (ID, ARTICLE_ID, IS_VALID) AS
    (
    SELECT 1, 1, 1 union ALL
    SELECT 2, 1, NULL 
    )
    SELECT art.ARTICLE_ID, com.IS_VALID 
      FROM ARTICLE AS art
           LEFT OUTER JOIN COMMENTAIRE AS com
             ON art.ARTICLE_ID = com.ARTICLE_ID
     WHERE com.IS_VALID = 1
        OR com.ID IS NULL;

    PS : Je connaissais pas cette syntaxe, c'est vrai que c'est beaucoup plus simple ainsi merci pour le tuyaux ;-)

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Exact j'avais mal vu votre première requête.

    Si ID est la PK de la table Commentaire (ou plutôt une colonne non nulle de la table), effectivement les deux syntaxes sont identiques.

Discussions similaires

  1. Problème dans left outer join
    Par aymen007 dans le forum SQL
    Réponses: 1
    Dernier message: 21/05/2008, 12h03
  2. [MySQL] left outer join et concaténation dans un tableau passe par if mais pas par else ?
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 08/04/2008, 15h09
  3. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  5. concatenation de chaine dans un left outer join
    Par the_edge dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/11/2004, 16h08

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