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 :

Jointure sur plusieurs tables [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut Jointure sur plusieurs tables
    Bonjour,

    Les personnes m'ayant aidé hier sur un autre sujet vont être contente de voir que je suis leurs conseils.

    Jusqu'à lors je faisais des jointures avec dans les WHERE, ca fonctionne très bien, mais dans un soucis de lisibilité et d'apprentissage de nouvelles choses je m'essaie aux jointures avec JOIN.

    Effectivement c'est plus lisible. La jointure entre 2 tables fonctionne parfaitement tout va bien. Mais dès que j'essaie de mettre une 3eme table, la rien ne va plus.

    Je m'explique :
    J'ai 3 tables :

    BASEC(reference, indice)
    BASEC1(ID_base, #reference, #NoOF, datecontrole, initiales)
    BASEC2(NoOF, #reference, valeur)

    Pour la jointure entre 2 tables BASEC et BASEC1 tout va bien ca fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT 
    	max(BASEC1.DateControle), 
    	BASEC.reference, 
    	BASEC.indice, 
    	BASEC1.Initiales
     
    FROM
    	BASEC
    	JOIN BASEC1
    	ON BASEC.reference=BASEC1.reference			
    GROUP BY
    	BASEC.refart, 
    	BASEC.indice, 
    	BASEC1.Initiales
    Mais dès que BASEC2 fait son entrée c'est erreur sur 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
    17
    18
    SELECT DISTINCT 
    	max(BASEC1.DateControle), 
    	BASEC.reference, 
    	BASEC.indice, 
    	BASEC1.Initiales,
                  BASEC2.NoOF
     
    FROM
    	BASEC
    	JOIN BASEC1
    	ON BASEC.reference=BASEC1.reference
                  JOIN BASEC2
    	ON BASEC1.NoOF=BASEC2.NoOF		
    GROUP BY
    	BASEC.refart, 
    	BASEC.indice, 
    	BASEC1.Initiales,
                  BASEC2.NoOF
    L'erreur indiquée est :
    Incorrect syntax near 'BASEC2'.

    J'ai bien compris que ma synthaxe ne doit pas être la bonne. J'ai lu divers forums et tutos depuis hier, et je ne vois pas où cela cloche.

    Pouvez vous m'aidez et m'indiquer mes erreurs s'il vous plait.

    Cordialement.


    M4itreG.

  2. #2
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    'BASE_CONTROLE_LIG' ne fait pas parti de cette requête, est-ce qu'en l'exécutant seule elle donne cette erreur, ou fait-elle partie d'un ensemble de lignes de code?

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  3. #3
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut
    Bonjour,

    Excuse moi Lyche, j'ai fait un bête copier coller. Je n'écris pas sur le forum les vrais nom des tables du projet simplement pour avoir un exemple basique, que je glisse ensuite dans un classeur de solutions.

    J'ai modifier le message d'erreur avec le bon nom de la table.

    Mille excuses.

    Cordialement.


    M4itreG

  4. #4
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Pas de soucis

    Je ne sais pas si tu as remarqué, mais ta colonne reference dans ton select et ta jointure a été remplacée par "refart" dans le group by.

    ça ne corrigera pas ton soucis dans l'immédiat, cependant, ça t'en évitera un après

    j'ai rajouté des crochets à tes noms de colonnes et de tables.

    Il est possible qu'un des noms de colonne ne soit pas bien interprêté par SQL Server.

    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
    SELECT MAX([BASEC1].[DateControle]),
           [BASEC].[reference]         ,
           [BASEC].[indice]            ,
           [BASEC1].[Initiales]        ,
           [BASEC2].[NoOF]
      FROM [BASEC]
           INNER JOIN [BASEC1] ON [BASEC].[reference] = [BASEC1].[reference]
           INNER JOIN [BASEC2] ON [BASEC1].[NoOF] = [BASEC2].[NoOF]
     GROUP BY
           --[BASEC].[refart]    , erreur?
           [BASEC].[reference]    ,
           [BASEC].[indice]    , 
           [BASEC1].[Initiales],
           [BASEC2].[NoOF]

    Peux-tu me dires si ça fonctionne mieux ainsi?

    Edit : Lorsque tu fais un group by, le DISTINCT devient inutile. Le principe d'un group by est de ne sortir qu'une seule ligne par "groupement"

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  5. #5
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut
    Pour le "refart" c'était juste une erreur de ma part. Enfin un test pour voir si tu étais concentré . (je blague).

    En effet ta solution fonctionne et tout va bien .

    Les crochets montrent a SQL qu'il s'agit de tables et colonnes ? (pour lui spécifier ?)

    Juste une autre question concernant la jointure pour eviter de rouvrir un autre sujet :

    La seconde jointure :
    INNER JOIN [BASEC2] ON [BASEC1].[NoOF] = [BASEC2].[NoOF]
    Elle doit etre en relation obligatoirement avec la fin de la première ou elle peut reprendre depuis le début ?

    Je m'exprime mieux.
    Dans la 1ere : on a BASEC1 qui est joint avec BASEC
    Dans la 2eme : on a BASEC2 qui est joint avec BASEC1

    Dans l'hypothèse d'une 3eme avec une 4eme table, et que les clef concordent bien sur.
    Puis je faire : BASEC3 joint a BASEC ? ou obligatoirement la rejoindre a BASEC2.

    J'espère avoir expliqué du mieux que j'ai pu. Là ma question n'est plus concrête mais plutôt abstraite, au cas ou le cas se produirait, c'est pour comprendre mieux.


    Cordialement.


    M4itreG

  6. #6
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    ta jointure peut être faite avec toutes les tables appelée au dessus. Qu'importe le "niveau".

    Les crochets permettent surtout d'éviter "l'interprétation" d'un élément du nom d'une colonne. Les caractères spéciaux, les lettres, (je conseil même d'éviter les chiffres autant que faire se peut), les espaces. Tout ce qui n'est pas de l'ordre de l'alphabétique peut, potentiellement poser des soucis.
    Tout comme les mots clés réservés.

    Par exemple "User", j'ai eu le cas une fois d'une table nommée "user" (contre ma recommendation d'ailleurs). Et bien à chaque fois que quelqu'un oubliait les [], User était utilisé par le SGBD comme la fonction du même nom. Et tout plantait...

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Voilà qui devrait faire votre bonheur : Cours sur les jointures

    C'est bien d'utiliser les clauses JOIN

    Sinon, j'ai regardé en diagonale et dans la requête de votre premier message, c'est apparemment juste une mauvaise syntaxe pour la jointure.

    Ex :

    Soit les tables suivantes : en gras la clef primaire et en italique, les clefs étrangère (le souligné masquait l'underscore)
    TABLE1(ID_1, COL1, COL2, COL3)
    TABLE2(ID_2, ID_1, COL4, COL5, COL6)
    TABLE3(ID_3, ID_2, COL7, COL8, COL9)

    Je peux alors écrire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
            *
    FROM
            TABLE1 A
                INNER JOIN TABLE2 B
                    ON A.ID_1 = B.ID_1
                    INNER JOIN TABLE3 C
                        ON B.ID_2 = C.ID_2
    P.S. : L'indentation est personnelle. Vous indentez comme vous voulez hein (on même tout écrire sur la même ligne si on veut)
    Kropernic

  8. #8
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Voilà qui devrait faire votre bonheur : Cours sur les jointures

    C'est bien d'utiliser les clauses JOIN

    Sinon, j'ai regardé en diagonale et dans la requête de votre premier message, c'est apparemment juste une mauvaise syntaxe pour la jointure.

    Ex :

    Soit les tables suivantes : en gras la clef primaire et en italique, les clefs étrangère (le souligné masquait l'underscore)
    TABLE1(ID_1, COL1, COL2, COL3)
    TABLE2(ID_2, ID_1, COL4, COL5, COL6)
    TABLE3(ID_3, ID_2, COL7, COL8, COL9)

    Je peux alors écrire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
            *
    FROM
            TABLE1 A
                INNER JOIN TABLE2 B
                    ON A.ID_1 = B.ID_1
                    INNER JOIN TABLE3 C
                        ON B.ID_2 = C.ID_2
    P.S. : L'indentation est personnelle. Vous indentez comme vous voulez hein (on même tout écrire sur la même ligne si on veut)
    Je vois pas où est la mauvaise syntaxe par rapport à ses tables

    les colonnes #reference, #NoOF sont les FK et elles sont exploitées dans la jointure.
    Où alors je suis fou (pas improbable d'ailleurs )
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  9. #9
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    My bad ! Je viens d'aller relire et j'avais louper un JOIN. J'avais dit que j'avais lu en diagonale XD. Du coup, je voyais deux ON qui se suivaient (avec leur prédicat respectif bien sûr)
    Kropernic

  10. #10
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    My bad ! Je viens d'aller relire et j'avais louper un JOIN. J'avais dit que j'avais lu en diagonale XD. Du coup, je voyais deux ON qui se suivaient (avec leur prédicat respectif bien sûr)
    ça arrive ça arrive
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  11. #11
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Du coup, j'ai été relire plus en détail et je ne vois vraiment pas ce qui pourrait causer l'erreur de syntaxe.

    Mais vu que la mise entre crochet résout le problème et que MaîtreG nous confesse qu'il édulcore son code, on peut raisonnablement penser qu'il doit s'agir de l'utilisation d'un mot réservé ou d'une table/colonne ayant un nom farfelu.
    Kropernic

  12. #12
    Membre régulier
    Homme Profil pro
    Apprenti en développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Apprenti en développement logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 67
    Points : 97
    Points
    97
    Par défaut
    Messieurs, je vous remercie de vous être penché sur mon cas. (Encore une fois pour Kropernic).

    C'est bon j'ai compris les jointures, merci pour le lien du cours, j'en avais lu d'autres sur d'autres forums et sites mais ils n'allaient jamais plus loin que 2 tables.
    Décidément il faut vraiment que je pense : developpez.com tout le temps


    J'ai ré-enlevé les crochets dans la requête pour re-tester et ... ça fonctionne ... Je ne sais pas quel bidouille j'avais fait. Mais bon au moins la j'ai lancé toutes mes questions.

    Je pars à la pratique ...


    Je vous remercie encore de votre aide.
    Je reviendrais avec une autre question et de nouvelles aventures. héhé

    Bonne fin de journée et bonne fin d'année.

    Cordialement.

    M4itreG

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

Discussions similaires

  1. Problème de jointure sur plusieurs tables
    Par papouuu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/01/2011, 14h02
  2. [AC-2007] Jointure sur plusieurs tables
    Par Steph0 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 20/01/2011, 08h24
  3. jointure sur plusieurs tables fonctionne pas
    Par jmsch dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/11/2010, 21h55
  4. Jointures sur plusieurs tables
    Par Daibai dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/12/2009, 09h55
  5. hibernate-criteria : jointure sur plusieurs tables
    Par loic72 dans le forum Hibernate
    Réponses: 9
    Dernier message: 24/09/2007, 17h27

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