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

SQL Oracle Discussion :

Passage de (+) à OUTER JOIN


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 68
    Par défaut Passage de (+) à OUTER JOIN
    Bonjour,

    J'aimerais mettre à jour une requête un peu compliquée.
    L'objectif serait de passer de l'"ancienne" syntaxe (+), à la syntaxe Outer Join.

    Voici ma requête qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT *
      FROM A, B, D, E, F, G, N
    WHERE B.CODE (+) = A.CODE 
        AND D.ID (+) = B.ID
        AND E.CODE (+) = A.CODE 
        AND F.SEQ (+) = 6
        AND G.ID = A.ID
        AND N.CODE = 'GR'
    Et l'ébauche de la nouvelle:
    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
     
    SELECT *
      FROM A 
       LEFT OUTER JOIN B
              ON B.CODE = A.CODE
       LEFT OUTER JOIN E
              ON E.CODE = A.CODE
            , D --Le problème survient dès l'ajout de cette table
       LEFT OUTER JOIN B
              ON D.ID = B.ID
            , F
       LEFT OUTER JOIN dual
              ON F.SEQ = 6
            , G
            , N
    WHERE G.ID = A.ID
        AND N.CODE = 'GR'
    Le problème sur cette deuxième requête survient dès que je veux ajouter la table "D" dans le FROM.
    J'imagine que le problème est uniquement syntaxique, mais je ne trouve aucune aide sur le sujet.

    Merci d'avance pour vos réponses.
    Meilleures salutations.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Il n'y a pas de virgule dans le FROM en utilisant les JOIN.
    Vous l'avez bien écrit pour A, B, E, donc continuez vous êtes sur la bonne voie !
    Votre soucis sera pour N et F je pense, mais je vous laisse avancer.

    Ah oui, n'hésitez pas à ajouter vos tables une par une et à tester votre requête à chaque fois, ça aide.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 68
    Par défaut
    Merci beaucoup pour votre réponse.

    En effet, j'ai également essayé sans les virgules, mais dès que j'écris ma requête comme ceci:

    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
     
    SELECT *
      FROM A 
       LEFT OUTER JOIN B
              ON B.CODE = A.CODE
       LEFT OUTER JOIN E
              ON E.CODE = A.CODE
              D
       LEFT OUTER JOIN B
              ON D.ID = B.ID
            /*, F
       LEFT OUTER JOIN dual
              ON F.SEQ = 6
            , G
            , N
    WHERE G.ID = A.ID
        AND N.CODE = 'GR' */
    L'erreure suivante apparaît (en sélectionnant la table D):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00933: SQL command not properly ended
    Comme le 3ème OUTER JOIN entre la table B et D n'a aucun lien avec la table A, je mettais la "," avant D pour les séparer.
    Car dans le cas si dessus, je ne comprend pas comment la table "D" peut être reconnue en tant que table?!

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Ce n'est pas très grave. Ce qu'il faut c'est que vous référenciez dans votre jointure une table qui est déjà située dans le FROM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM A 
        LEFT OUTER JOIN B
          ON B.CODE = A.CODE
        LEFT OUTER JOIN E
          ON E.CODE = A.CODE
        LEFT OUTER JOIN D
          ON D.ID = B.ID

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 68
    Par défaut
    Ho super, merci beaucoup Waldar!
    C'est sur des petites choses comme ça que certaine fois je bloque

    Grâce à vous j'ai fais un grand pas en avant, mais maintenant je m'attaque à la partie N et F et je vous tiens au courant.

    Pour l'instant la requête suivante s'exécute sans erreur:
    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
     
    SELECT *
      FROM A 
       LEFT OUTER JOIN B
              ON B.CODE = A.CODE
       LEFT OUTER JOIN E
              ON E.CODE = A.CODE
       LEFT OUTER JOIN D
              ON D.ID = B.ID
         /*, F
       LEFT OUTER JOIN dual
              ON F.SEQ = 6*/
            , G
         --, N
    WHERE G.ID = A.ID
     --AND N.CODE = 'GR'

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Pour la table G, pensez à utiliser INNER JOIN qui remplacera agréablement la virgule.
    Pour F et N, je vous donne deux pistes que vous pouvez éventuellement mélanger :
    1 - CROSS JOIN : produit cartésien, donc sans condition de jointure
    2 - faire un sous-select de F et N directement dans le FROM

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

Discussions similaires

  1. Jointures de type OUTER JOIN
    Par Oluha dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2005, 16h11
  2. 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
  3. Remplacer FULL OUTER JOIN
    Par funrighd dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/07/2004, 10h54
  4. probleme avec OUTER / OUTER JOIN
    Par Volcomix dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 21/04/2004, 16h57
  5. [ requeste sql ]INNER JOIN / OUTER JOIN
    Par hocinema dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/04/2004, 21h28

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