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 :

[SQL Server] Probleme de jointures


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut [SQL Server] Probleme de jointures
    Bonjour,

    j'ai un petit problème avec une requete qui parait simpliste.
    Voici le schéma des 3 tables simplifiées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Table ADR : ADR_ID, ADR_NAME, ADR_CLIENT_ID
    Table CLIENT: CLIENT_ID, CLIENT_NAME
    Table TXT : TXT_ID, TXT_NAME, TXT_CLIENT_ID
    les jointures se font entre CLIENT_ID et les CLIENT_ID des 2 autres tables. Un client peut donc avoir plusieurs ADR et plusieurs TXT

    La requete qui pose probleme est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select + from client, adr, txt where client_id = adr_client_id and client_id = txt_client_id.
    Le problème est qu'un client n'a pas forcement de TXT associé, et là c'est le drame. SI un client n'a pas de TXT mais a (ou n'a pas) de ADR, la requete ne me le selectionne pas.

    Je souhaiterai savoir l'astuce SQL pour pallier ce probleme. Merci d'avance.

    Sincerement

    Niko.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Fait plutôt des VRAIES jointures : http://sql.developpez.com/sqlaz/jointures/

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    Wahoo, c'est super long !

    Merci pour ta réponse rapide, mais tu pourrais m'eclairer un peu +, me donner une correction ou me dire a quelle partie de ton document je dois me referer. Car ma jointure est une jointure tout ce qu'il ya de plus simple, qu'est ce qu'une vraie jointure pour toi ?

    Merci encore !

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    ici, ce n'est pas vraiment une jointure, dans le sens où tu fais en fait un produit cartésien des tables, qui est ensuite restreint à certaines valeurs (en gros... c'est équivalent à une bidouille pour simuler un INNER JOIN), en théorie, la logique de la requête n'est pas du tout la même

    dans ton cas, je pense qu'un (ou deux) LEFT JOIN devrai(en)t t'être plus utile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT C.*, A.*, T.*
    FROM client AS C
    <div style="margin-left:40px">LEFT JOIN adr AS A
    <div style="margin-left:40px">ON C.client_id = A.adr_client_id</div>LEFT JOIN txt AS T
    <div style="margin-left:40px">ON C.client_id = T.txt_client_id</div></div>
    Il existe plusieurs types de jontures comme tu le verras dans le tuto le plus souvent, c'est LEFT JOIN qui est utilisé ^^

    Au fait, juste comme ça... essaie de toujours spécifier les champs que tu veux au retour de la requête, plutôt que d'utiliser un joker (*) ça permet d'éviter parfois quelques... soucis de collisions entre les noms de colonnes (généralement c'est pas un problème, mais si le résultat de la requête doit être traité par un langage externe à SQL, ça peut devenir embêtant )

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    Merci, j'ai bien compris le truc, je vais tester ça de ca pas. Par contre, vu que tu es un PRO, je voulais savoir si ces LEFT JOIN était accepté par tous les SGBDR... car mes requetes se doivent d'etre multibases (au moins SQL Server, Firebird, mySQL et ORACLE)

    Merci pour tes explications !

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Points : 58
    Points
    58
    Par défaut
    Et ce tuto, il est énorme. j'étais loin de me douter que SQL regorgeait de tant de subtilités ! Je te dois une fière chandelle.... merci

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par pi05
    Merci, j'ai bien compris le truc, je vais tester ça de ca pas. Par contre, vu que tu es un PRO, je voulais savoir si ces LEFT JOIN était accepté par tous les SGBDR... car mes requetes se doivent d'etre multibases (au moins SQL Server, Firebird, mySQL et ORACLE)

    Merci pour tes explications !
    Attention, Oracle n'implémente les jointures normalisées SQL2 (Join & co) qu'à partir de la version 9

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par pi05
    Merci, j'ai bien compris le truc, je vais tester ça de ca pas. Par contre, vu que tu es un PRO, je voulais savoir si ces LEFT JOIN était accepté par tous les SGBDR... car mes requetes se doivent d'etre multibases (au moins SQL Server, Firebird, mySQL et ORACLE)

    Merci pour tes explications !
    Attention, Oracle n'implémente les jointures normalisées SQL2 (Join & co) qu'à partir de la version 9

  9. #9
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par pi05
    Merci, j'ai bien compris le truc, je vais tester ça de ca pas. Par contre, vu que tu es un PRO, je voulais savoir si ces LEFT JOIN était accepté par tous les SGBDR... car mes requetes se doivent d'etre multibases (au moins SQL Server, Firebird, mySQL et ORACLE)

    Merci pour tes explications !
    Attention, Oracle n'implémente les jointures normalisées SQL2 (Join & co) qu'à partir de la version 9

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

Discussions similaires

  1. [SQL Server] problème de classement, calcul d'un rang
    Par lepeule dans le forum Langage SQL
    Réponses: 12
    Dernier message: 22/10/2019, 10h31
  2. Réponses: 4
    Dernier message: 09/05/2006, 08h55
  3. [SQL Server] Probleme de format de date
    Par flydragon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2006, 17h49
  4. Sql Server Probleme Truncate / Pas Arrondi
    Par Nathan_2 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/05/2006, 19h09
  5. [SQL Server] Probleme avec not exists
    Par maxxou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/03/2006, 16h51

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