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 :

JOIN COMPLEXE à résoudre. Besoin urgent d'aide. [Reformulé]


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut JOIN COMPLEXE à résoudre. Besoin urgent d'aide. [Reformulé]
    Bonjour à tous,

    Désolé pour ne pas connaître toutes les règles et fonctionnement du forum, c'est la première fois que j'en utilise un.
    Soyez indulgent s'il vous plaît.

    Je vais reformuler mon problème.

    Voici ma situation;

    J'utilise 2 tables;
    Table 1 : Table des Langues
    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 TABLE Table1                            
    (LALAN INTEGER,                                 
     LACLD INTEGER,                                 
     LATXT CHAR(15),                                
     CONSTRAINT PK_TABLE1 PRIMARY KEY (LALAN, LACLD))
     
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (1, 1, 'FRANCAIS')                      
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (1, 2, 'FRENCH')                        
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (2, 1, 'ANGLAIS')                       
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (2, 2, 'ENGLISH')
    Table 2 : Table des Formats
    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
     
    CREATE TABLE Table2                            
    (FMDFORM CHAR(5),                                 
     FMDLANG INTEGER,                                 
     FMDDESC CHAR(10),                                
     FMDDESL CHAR(40),                                
     CONSTRAINT PK_TABLE2 PRIMARY KEY (FMDFORM, FMDLANG))
     
    INSERT INTO TABLE2 (FMDFORM, FMDLANG, FMDDESC, FMDDESL)
    VALUES ('OUVER',1,'T.OUVERT','TOIT OUVERT')
    INSERT INTO TABLE2 (FMDFORM, FMDLANG, FMDDESC, FMDDESL)
    VALUES ('OUVER',2,'OPEN TOP','OPEN TOP')   
    INSERT INTO TABLE2 (FMDFORM, FMDLANG, FMDDESC, FMDDESL)
    VALUES ('PFORM',1,'PL.FORME','PLATE-FORME')
    INSERT INTO TABLE2 (FMDFORM, FMDLANG, FMDDESC, FMDDESL)
    VALUES ('PFORM',2,'FLAT BED','FLAT BED')
    Je fais un join des 2 tables afin d'avoir dans une grille les descriptions
    d'un format et ses descriptions multilangue dans la langue de l'usager

    Grille pour un usager français
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT FMDFORM, LACLD, LATXT, FMDDESC, FMDDESL
    FROM TABLE1 T1                                    
         LEFT OUTER JOIN TABLE2 T2                    
              ON (LALAN = FMDLANG)                  
    WHERE LACLD = 1                                 
    ORDER BY FMDFORM, LACLD
    Grille pour un usager anglais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT FMDFORM, LACLD, LATXT, FMDDESC, FMDDESL
    FROM TABLE1 T1                                    
         LEFT OUTER JOIN TABLE2 T2                    
              ON (LALAN = FMDLANG)                  
    WHERE LACLD = 2                                 
    ORDER BY FMDFORM, LACLD
    Problème;
    Si je rajoute un code de langue pour Espagnol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (1, 3, 'FRANCOS')                      
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (2, 3, 'ANGLOS')                        
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (3, 1, 'ESPAGNOL')                       
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (3, 2, 'SPANISH') 
    INSERT INTO TABLE1 (LALAN, LACLD, LATXT)          
    VALUES (3, 3, 'SPAGNOL')
    Le résultat que j'ai actuellement est;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FMDFORM          LACLD   LATXT            FMDDESC     FMDDESL    
     OUVER               1   FRANCAIS         T.OUVERT    TOIT OUVERT
     OUVER               1   ANGLAIS          OPEN TOP    OPEN TOP   
     PFORM               1   FRANCAIS         PL.FORME    PLATE-FORME
     PFORM               1   ANGLAIS          FLAT BED    FLAT BED   
     -                   1   ESPAGNOL         -           -
    Le résultat du join que je voudrais;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FMDFORM          LACLD   LATXT            FMDDESC     FMDDESL    
     OUVER               1   FRANCAIS         T.OUVERT    TOIT OUVERT
     OUVER               1   ANGLAIS          OPEN TOP    OPEN TOP   
     OUVER               1   ESPAGNOL         -           -        
     PFORM               1   FRANCAIS         PL.FORME    PLATE-FORME
     PFORM               1   ANGLAIS          FLAT BED    FLAT BED   
     PFORM               1   ESPAGNOL         -           -
    Votre aide serait très appréciée.

    Merci

  2. #2
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    tu prends ta requete (tu ne nous la pas donnée , et j'ai pas envie de la retrouver) et tu met un 'LEFT JOIN' ou un 'RIGHT JOIN' a la place du 'INNER JOIN', suivant que ta table langue est la 1ere ou la 2nde pour la jointure (càd a gauche ou a droite du join)

    au passage : un titre clair permet au gens capables de t'aider de s'intéresser a ton problème , plus que 'J'ai un problème' car chaque sujet ici est un problème à solutionner ....

    EDIT : joli reprise, la au moins , c'est tres clair ...
    par contre la réponse que j'ai a te donner sera moins simpa je le crains :
    Il me semble que dans l'état actuel de ta base , le seul moyen serait de passer par des UNION, et il faudrait reprendre la requete a chaque ajout d'un nouveau FMDFORM.

    Mon conseil : rajoute une table qui te liste les codes FMDFORM , et qui sera ainsi indépendante de tes langues

    ex (simple,pas le mieux, mais qui s'insère facilement dans ta base) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE TableFMDFORM                            
    (FMDFORM CHAR(5),                                  
     CONSTRAINT PK_TABLEFMDFORM PRIMARY KEY (FMDFORM)) 
     
    INSERT INTO TableFMDFORM(FMDFORM) 
         VALUES ('OUVER') 
    INSERT INTO TableFMDFORM(FMDFORM) 
         VALUES ('PFORM')
    au passage : tu as oublié les clés étrangères dans ton code .. mais bon, c'ets pas trop grave

    a partir de la , tu peux facilement récupérer ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT FMDFORM, LACLD, LATXT, FMDDESC, FMDDESL 
    FROM TABLE1 T1                                    
         LEFT OUTER JOIN TABLE2 T2                    
              ON (LALAN = FMDLANG)
         LEFT OUTER JOIN TableFMDFORM T3
              ON T2.FMDFORM=T3.FMDFORM
    WHERE LACLD = 2                                  
    ORDER BY FMDFORM, LACLD
    a peu pres

  3. #3
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Merci Gillou,
    Je sais pas encore si mon environnement va me permettre de faire quelque chose dans le style que tu me proposes.
    Ça m'a par contre donné un autre idée.
    Les solutions ne pleuvent pas beaucoup.
    Je vais donc dormir dessus.

  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
    21 779
    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 : 21 779
    Points : 52 754
    Points
    52 754
    Billets dans le blog
    5
    Par défaut
    A lire :
    http://sqlpro.developpez.com/SQL_AZ_P.html
    problème n°12

    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 habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Bonjour SQLPro,

    J'ai regardé le problème et ça ne concorde pas avec mon problème.

    J'avais déjà fait le tour des problèmes.

    Lorsque j'ajoute une langue dans ma première table, évidemment les records ne se créer pas automatiquement dans ma deuxième table pour chaque clé (FMDFORM).

    Ce que je voudrais faire c'est un join qui me permettrait de voir FMDFORM avec ses descriptions déjà existante + un record avec les descriptions à blanc pour la langue nouvellement créé.

    Pas facile hien?!?

  6. #6
    Membre habitué Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Points : 171
    Points
    171
    Par défaut
    Heureka!!
    J'ai trouvé.

    Voici le code;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT *                                             
    FROM   table1
         LEFT OUTER JOIN table2 on (lalan = fmdlang)         
    UNION (SELECT *
               FROM   table1 
                     LEFT OUTER JOIN table2 on (lalan = fmdlang)        
               WHERE  fmdform is null)                             
     
    ORDER BY fmdform,lacld,lalan

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

Discussions similaires

  1. [Python 3.X] Besoin urgent d'aide sur une fonction qui me semble pourtant simple à créer.
    Par Mrflop124 dans le forum Général Python
    Réponses: 7
    Dernier message: 25/04/2015, 17h13
  2. j ai besoin de l aide trés urgent mes chers amis
    Par casanostra82 dans le forum Ubuntu
    Réponses: 0
    Dernier message: 18/11/2009, 20h35
  3. connection à une base de donné ,besoin urgent d'aide
    Par nadhem dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 21/07/2006, 15h28

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