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

Développement SQL Server Discussion :

Problème de jointures complexes


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 96
    Par défaut Problème de jointures complexes
    Bonjour à tous !

    J'ai réalisé une vue qui se base sur 3 autres vues (je pensais que ça me résoudrait un autre problème et au bout du compte c'est plus facile à maintenir). Sur cette vue "Racine" j'ai une jointure qui me pose un réel problème :

    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
    FROM
    Vue_Spend_Analysis_Branche1 AS [BRANCHE1],
    PCH1
    	INNER JOIN OPCH
    	ON PCH1.DOCENTRY = OPCH.DOCENTRY
    	LEFT OUTER JOIN OSLP
    	ON PCH1.SLPCODE = OSLP.SLPCODE
    	LEFT OUTER JOIN OACT
    	ON PCH1.ACCTCODE = OACT.ACCTCODE
    	LEFT OUTER JOIN OPRJ
    	ON PCH1.PROJECT = OPRJ.PRJCODE
    	LEFT OUTER JOIN OOCR
    	ON PCH1.OCRCODE = OOCR.OCRCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche2 AS [BRANCHE2]
    	ON PCH1.ITEMCODE = BRANCHE2.ITEMCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche3 AS [BRANCHE3]
    	ON PCH1.BASEREF = BRANCHE3.TrgetEntry AND PCH1.BASELINE = BRANCHE3.LINENUM
    Cette jointure me remonte énormément trop de résultat. J'ai isolé le problème car en faisant ça
    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
    PCH1
    	INNER JOIN OPCH
    	ON PCH1.DOCENTRY = OPCH.DOCENTRY
    	LEFT OUTER JOIN OSLP
    	ON PCH1.SLPCODE = OSLP.SLPCODE
    	LEFT OUTER JOIN OACT
    	ON PCH1.ACCTCODE = OACT.ACCTCODE
    	LEFT OUTER JOIN OPRJ
    	ON PCH1.PROJECT = OPRJ.PRJCODE
    	LEFT OUTER JOIN OOCR
    	ON PCH1.OCRCODE = OOCR.OCRCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche2 AS [BRANCHE2]
    	ON PCH1.ITEMCODE = BRANCHE2.ITEMCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche3 AS [BRANCHE3]
    	ON PCH1.BASEREF = BRANCHE3.TrgetEntry AND PCH1.BASELINE = BRANCHE3.LINENUM
    Le nombre de résultats est correct !

    J'avais tenté un bout de code que SQL-Server rejetait en bloc :
    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
     
    FROM
    OPCH
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche1 AS [BRANCHE1]
    	ON OPCH.CARDCODE = BRANCHE1.CARDCODE
    PCH1
    	INNER JOIN OPCH
    	ON PCH1.DOCENTRY = OPCH.DOCENTRY
    	LEFT OUTER JOIN OSLP
    	ON PCH1.SLPCODE = OSLP.SLPCODE
    	LEFT OUTER JOIN OACT
    	ON PCH1.ACCTCODE = OACT.ACCTCODE
    	LEFT OUTER JOIN OPRJ
    	ON PCH1.PROJECT = OPRJ.PRJCODE
    	LEFT OUTER JOIN OOCR
    	ON PCH1.OCRCODE = OOCR.OCRCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche2 AS [BRANCHE2]
    	ON PCH1.ITEMCODE = BRANCHE2.ITEMCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche3 AS [BRANCHE3]
    	ON PCH1.BASEREF = BRANCHE3.TrgetEntry AND PCH1.BASELINE = BRANCHE3.LINENUM
    SQL-Server me rejette car il y a 2 déclarations de la table OPCH, seulement moi j'ai bien besoin de relié PCH1 <=> OPCH ainsi que OPCH <=> BRANCHE1.

    J'espère que j'ai été à peu près clair, merci d'avance pour votre aide (parce que j'en ai vraiment besoin. T_T

  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
    Non, ce n'est pas clair du tout !
    Si ça peut vous aider, pour utiliser deux fois la même table dans une même requête il suffit de l'aliaser, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ...
      FROM matable as t1
           CROSS JOIN matable as t2

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 96
    Par défaut
    Désolé Waldar je vais essayé de préciser.

    Je voudrais lié PCH1 / OPCH / Branche1. Problème n'ayant jamais fait/étudié de jointure complexe avant maintenant je ne suis pas sur de la démarche à faire.

    Le problème est que je ne veux pas appeler 2 fois la table OPCH mais une seule et unique fois. Seulement aux vues de mes jointures, SQL-Server considère que je l'ai déclaré 2 fois.
    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
     
    FROM
    OPCH
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche1 AS [BRANCHE1]
    	ON OPCH.CARDCODE = BRANCHE1.CARDCODE
    PCH1
    	INNER JOIN OPCH
    	ON PCH1.DOCENTRY = OPCH.DOCENTRY
    	LEFT OUTER JOIN OSLP
    	ON PCH1.SLPCODE = OSLP.SLPCODE
    	LEFT OUTER JOIN OACT
    	ON PCH1.ACCTCODE = OACT.ACCTCODE
    	LEFT OUTER JOIN OPRJ
    	ON PCH1.PROJECT = OPRJ.PRJCODE
    	LEFT OUTER JOIN OOCR
    	ON PCH1.OCRCODE = OOCR.OCRCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche2 AS [BRANCHE2]
    	ON PCH1.ITEMCODE = BRANCHE2.ITEMCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche3 AS [BRANCHE3]
    	ON PCH1.BASEREF = BRANCHE3.TrgetEntry AND PCH1.BASELINE = BRANCHE3.LINENUM
    Comme je ne connais pas la syntaxe/l'utilisation exacte de ce genre de jointure j'étais venu demander de l'aide.

    Toutefois j'ai isolé le problème qui était à l'origine un trop grand nombre de résultats récupérés. La cause provenait d'une jointure dans Branche1...

    Néanmoins le problème que j'ai rencontré avec les jointures sur OPCH m'intrigue toujours autant.

    Waldar à quoi correspond la jointure CROSS JOIN ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    Est-ce qu'est possible d'avoir le contenu du message ? Le soucis est que vous n'expliquez pas ce que vous voulez obtenir depuis les tables mais seulement vos tentatives de jointures qui ne nous pas plus comprendre le problème.
    Pourquoi pas expliquer le rôle de chaque table et vue ? Cela permettrait de mieux comprendre. merci

  5. #5
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FROM
    OPCH
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche1 AS [BRANCHE1]
    	ON OPCH.CARDCODE = BRANCHE1.CARDCODE
    PCH1
    	INNER JOIN OPCH
    	ON PCH1.DOCENTRY = OPCH.DOCENTRY
    Le bout de code que j'ai souligné est incorrect. Essaie ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FROM
    OPCH 01
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche1 AS [BRANCHE1]
    	ON O1.CARDCODE = BRANCHE1.CARDCODE
    	INNER JOIN PCH1 P1 
    	ON P1.DOCENTRY = O1.DOCENTRY

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 96
    Par défaut
    Merci WOLO_Laurent

    Maintenant j'ai compris comment ça marchait ! En fait il suffit d'utiliser une seule fois la table dans des jointures, pour pouvoir l'utiliser partout ailleurs

    Mon code déclarait bien 2 fois la table OPCH. C'est chose corrigée désormais.
    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
     
    FROM
    OPCH
    	INNER JOIN Vue_Spend_Analysis_Branche1 AS [BRANCHE1]
    	ON OPCH.CARDCODE = BRANCHE1.CARDCODE
    	INNER JOIN PCH1
    	ON PCH1.DOCENTRY = OPCH.DOCENTRY
    	LEFT OUTER JOIN OSLP
    	ON PCH1.SLPCODE = OSLP.SLPCODE
    	LEFT OUTER JOIN OACT
    	ON PCH1.ACCTCODE = OACT.ACCTCODE
    	LEFT OUTER JOIN OPRJ
    	ON PCH1.PROJECT = OPRJ.PRJCODE
    	LEFT OUTER JOIN OOCR
    	ON PCH1.OCRCODE = OOCR.OCRCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche2 AS [BRANCHE2]
    	ON PCH1.ITEMCODE = BRANCHE2.ITEMCODE
    	LEFT OUTER JOIN Vue_Spend_Analysis_Branche3 AS [BRANCHE3]
    	ON PCH1.BASEREF = BRANCHE3.TrgetEntry AND PCH1.BASELINE = BRANCHE3.LINENUM
    Merci tout le monde en tout cas.

    kageru > Eh bien je sais déjà quels tables et sur quels champs je dois liés, mon problème ne venait que de la syntaxe. J'admet que je suis pas un grand littéraire donc j'expose pas clairement mes problèmes. En somme j'avais juste besoin d'une petite explication

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

Discussions similaires

  1. Problème de jointure complexe
    Par aritas dans le forum SQL
    Réponses: 8
    Dernier message: 20/03/2014, 11h35
  2. Problème de jointure "complexe"
    Par StringBuilder dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/08/2012, 16h33
  3. Réponses: 5
    Dernier message: 08/03/2010, 14h30
  4. Réponses: 24
    Dernier message: 24/07/2007, 17h48
  5. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 11h27

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