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 3 tables SQL SERVEUR 2005


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 101
    Par défaut jointure sur 3 tables SQL SERVEUR 2005
    bonjour ,

    je dipose de 3 tables ( client, télephone, mail ) , on sachant que un client peut avoir plusieurs numero et plusieurs mail , j'aimerai avoir une requete qui me permette d'afichier pour chaque client ses coordonée + ses mail et ses telephone , j'ai fais un requete mais qui donne un resultat avec des doublons :



    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 CLI.CLI_ID, ---- id client
    CLI.CLI_NOM, --- nom du client
    CLI.CLI_PRENOM, ---- prénom du client
    CLI.CLI_ADRESSE , ----- @
    EML.EML_ADRESSE , @ mail du client 
    TEL.TEL_NUMERO, ---- numero de telephone
    TEL.TYPE ---- nature du numero (GSM, fax, fixe )
    FROM T_CLIENT CLI 
     
    JOIN T_EMAIL EML -
    ON CLI.CLI_ID = EML.CLI_ID 
     
     
     
    JOIN T_TELEPHONE TEL 
    ON CLI.CLI_ID = TEL.CLI_ID

    VOICI LE RESULTAT :

    id_cli ;
    -----
    2000;BAZI ;ELYAS;CITE 19 MAI 1965 N°56 - baba hacen;tin_tamashek@hotmail.com;07 70 52 53 49 ;FAX
    2000;BAZI ;ELYAS;CITE 19 MAI 1965 N°56 - baba hacen ;bazi_ELYAS@hotmail.com;07 70 52 53 49 ;FAX
    2000;BAZI ;ELYAS;CITE 19 MAI 1965 N°56 - baba hacen ;tin_tamashek@hotmail.com;07 70 86 00 01 ;GSM
    2000;BAZI ;ELYAS;CITE 19 MAI 1965 N°56 - baba hacen ;bazi_ELYAS@hotmail.com;07 70 86 00 01 ;GSM

    merci de votre aide

  2. #2
    Membre chevronné Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Par défaut C'est normal
    Bonjour,

    on sachant que un client peut avoir plusieurs numero et plusieurs mail
    C'est normal que vous ayez plusieurs fois le même client dans votre ensemble de résultats !
    Si ce n'est pas ce que vous désirez, il faut mettre à plat (aggréger) vos adresses emails et vos n° de téléphone.

    A partir de SQL serveur 2005, ça peut se faire avec une fonction d'agrégation en .NET; c'est sans doute la meilleure méthode.

    Vous pouvez aussi utiliser FOR XML en vous inspirant du code suivant

    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
     
    declare @tbclient table (nom varchar(20))
    insert into @tbclient select 'client1'
     
    declare @tbtel table (nom varchar(20), tel varchar(20))
    insert into @tbtel select 'client1', '000000000'
    insert into @tbtel select 'client1', '000000001'
     
    SELECT c.nom, 
    (SELECT tel + ' ' 
    FROM @tbtel t
    WHERE 
    t.nom = c.nom
    FOR XML PATH(''))
    FROM @tbclient c
    @+

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 101
    Par défaut
    merci pour ta réponse ,

    mais voila, je n'ai pas l'habitude d'utiliser des fonction d'agrégat , donc je vais me documenté decu et je te tienderai au courant .

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Vous pouvez aussi utiliser des fonction d'applatissement.

    Exemple :

    Les tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE T_CLI (CLI_ID INT, CLI_NOM VARCHAR(16))
    GO
    CREATE TABLE T_TEL (TEL_ID INT, CLI_ID INT, TEL_NUM CHAR(20), TEL_TYPE CHAR(3))
    GO
    Les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO T_CLI VALUES (1, 'DUPONT')
    INSERT INTO T_CLI VALUES (2, 'DURAND')
    GO
    INSERT INTO T_TEL VALUES (1, 1, '123456789', 'FIX')
    INSERT INTO T_TEL VALUES (2, 1, '789123456', 'FAX')
    INSERT INTO T_TEL VALUES (3, 1, '456789123', 'GSM')
    INSERT INTO T_TEL VALUES (4, 2, '060606060', 'GSM')
    GO
    La fonction :
    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
    CREATE FUNCTION dbo.F_GET_TELS (@CLI_ID INT)
    RETURNS VARCHAR(max)
    AS
    BEGIN
    DECLARE @RETVAL VARCHAR(max);
    SET @RETVAL = ''
    SELECT @RETVAL = @RETVAL + RTRIM(TEL_NUM) + ' (' + TEL_TYPE +'), '
    FROM   T_TEL 
    WHERE  CLI_ID = @CLI_ID;
    RETURN CASE 
           WHEN @RETVAL <> '' THEN SUBSTRING(@RETVAL, 1, LEN(@RETVAL) -1)
           ELSE NULL
           END;
    END
    GO
    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *, dbo.F_GET_TELS (CLI_ID) AS TELS
    FROM   T_CLI
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CLI_ID      CLI_NOM          TELS
    ----------- ---------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           DUPONT           123456789 (FIX), 789123456 (FAX), 456789123 (GSM)
    2           DURAND           060606060 (GSM)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 101
    Par défaut
    bonjour,

    merci a vous, avec le scipt suivant chez reussi a afficher les resultat comme voulu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT c.CLI_NOM, 
    (SELECT TEL_NUMERO + ' ' 
    FROM dbo.T_TELEPHONE t
    WHERE 
    t.CLI_ID = c.CLI_ID
    FOR XML PATH('')), (SELECT EML_ADRESSE + '' from dbo.T_EMAIL e where e.CLI_ID=c.CLI_ID FOR XML PATH('') )
    FROM dbo.T_CLIENT c
    ceci etant le resultat est mis dans un seul champs j'ai par exemple :


    nom tel mail
    ----- --- -----
    DUPONT 070145221 070065952 dupont-xavier@hotmail.com xavier-dupont@yahoo.fr


    le probleme est le suivant : lors de l'affichage du champ "tel" ou "mail" dans mon application , je risque d'avoir les deux numero dans le meme champ ce qui peut ne pas etre trés paratique . comment pourais je faire pour remédier a cela .

    SVP que veut dire l'expression SUBSTRING(@RETVAL, 1, LEN(@RETVAL) -1)




    merci beaucoup de votre aide

Discussions similaires

  1. sql serveur 2005 sur plusieur station?
    Par amazircool dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/07/2007, 09h57
  2. SQL serveur 2005 - Synchronisation de base sur 2 sites distant
    Par blueghost dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/05/2007, 18h14
  3. [SQL Server 8] Discussion : Full Jointure sur trois tables
    Par Baquardie dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/12/2006, 14h01
  4. Eviter les doublons sur un champ SQL Serveur 2005
    Par crashyear dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/12/2006, 08h02
  5. [SQL SERVEUR 2005] comment MAJ la structure de mes tables?
    Par unix27 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 01/11/2006, 22h06

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