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 :

Liaison par combinaison de valeurs en SQL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Liaison par combinaison de valeurs en SQL
    bonjour , j'ai une table1 :

    Code | PRODUIT
    1 P1
    2 R1
    3 R2
    4 R4

    Table 2 : PRODUIT1 | PRODUIT2 | SERVICE
    P1 NULL S1
    P1 R1 S2
    P1 R2 S3

    j'ai 2 table , j'aimerais lister les codes de la table1 avec les services associé dans la table2 , la requette doit chercher les combinaison à 2 des produits dans la tables 1 et les services associés dans la table2 en se basant sur PRODUCT1 et PRODUCT2

    le résultat doit afficher

    Code | PRODUIT1 | PRODUIT 2 | SERVICE
    1 P1 NULL S1
    2 P1 R1 S2
    3 P1 R2 S3

    aidez moi svp , je vois pas comment faire le truc .

    Merci

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    A l'aide d'une jointure :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T1.Code, T2.PRODUIT1, T2.PRODUIT2, T2.SERVICE
    FROM table1 AS T1
        JOIN table2 AS T2 ON T2.PRODUIT1 = T1.PRODUIT
    Voici un bon tuto pour comprendre et s'exercer

  3. #3
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    je pense que mon problème est mal compris , en fait la requette est plus compliqué qu'une simple jointure ,la requette doit voir si les combinaisons de la table2 se trouve dans la table 1 et afficher les codes service associé .

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    Bonjour,
    Je dirai que la jointure doit se faire sur t2.produit2, et quand ce dernier est null sur t2.produit1.
    Enfin c'est ce que j'ai compris du résultat attendu.
    On peut donc faire un truc du genre (pas testé);
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T1.Code, T2.PRODUIT1, T2.PRODUIT2, T2.SERVICE
    FROM table2 AS T2
        JOIN table1 AS T1 ON T1.PRODUIT = colaesce(T2.PRODUIT2,T2.PRODUIT1)

    Tatayo.

  5. #5
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    non ca ne donne pas parfaitement le bon résultat dans certain cas , pour bien expliquer mon problème,
    la table1 me permet d'avoir les combinaisons suivantes :
    P1 , NULL
    R1 , NULL
    R2, NULL
    R3, NULL
    P1,R1
    P1, R2
    P1,R3
    R1,R2
    R1,R3
    R2,R3
    donc je dois chercher pour chaque combinaison si y a une correspondance dans la table2 , si oui j'affiche le code service associé.

    Merci

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Serait-ce cela que tu veux faire ?
    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
    21
    22
    SELECT  pr1.produit AS  produit1
        ,   pr2.produit AS  produit2
        ,   srv.service AS  service
    FROM    table1  pr1
        CROSS JOIN
            (   SELECT  produit
                FROM    table1
            UNION
                SELECT  NULL
                FROM    table1
            )   pr2
        LEFT JOIN
            table2  srv
            ON  srv.produit1    = pr1.produit
            AND (   srv.produit2    = pr2.produit
                OR  (   srv.produit2    IS NULL
                    AND pr2.produit     IS NULL
                    )
                )
    WHERE   pr1.produit <> pr2.produit
        OR  pr2.produit IS NULL
    ;

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    Citation Envoyé par yassineonline2013 Voir le message
    je pense que mon problème est mal compris , en fait la requette est plus compliqué qu'une simple jointure ,la requette doit voir si les combinaisons de la table2 se trouve dans la table 1 et afficher les codes service associé .
    Je pense surtout qu'il est mal expliqué, parce que dans le premier mail la table1 ne montre aucune combinaison, ni aucun lien entre P1 et R1 par exemple...

    Tatayo.

  8. #8
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    je reformule ma question :

    j'ai une table1 qui contient deux colonne :

    Table1
    1|a
    2|b


    et table2 contient des combinaisons de a et b et c avec le service associé à chaque combinaison :

    Table 2
    a|b|service1
    a|c|service2
    b|c|service3
    a|NULL|service4


    la requette doit afficher les combinaisons possible de la table 1 qui se trouve dans la table 2 .

    resultat :

    a|b|service1
    a|NULL|service4

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    C'est toujours pas clair, parce que là le résultat c'est tout simplement la table 2

  10. #10
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    j'ai édité l'exemple pour qu'il soit plus compréhensible

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    le résultat n'est pas logique.

    Quelle règle de gestion faut-il appliquer pour arriver à un tel résultat ?

  12. #12
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    je reformule ma question :

    j'ai une table1 qui contient deux colonne :

    Table1
    id |produit
    1|a
    1|b


    et table2 contient des combinaisons de a et b et c avec le service associé à chaque combinaison :

    Table 2
    a|b|service1
    a|c|service2
    b|c|service3
    a|NULL|service4


    Règle de gestion :
    pour chaque id dans la table 1 , on construit les combinaison possible entre les valeurs de la colonne produit , dans notre exemple :
    l'id 1 a les combinaisons possible suivante : (a,b) , (a,null), (b,null)
    après on cherche les services correspondants dans la table 2
    dans la table 2 on ne retrouve que les combinaison : (a,b) , (a,null)
    resultat :

    a|b|service1
    a|NULL|service4

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    Peut-être un début de réponse:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select t2.*
    from table2 as t2
    inner join table1 as t1 on t1.id = t2.id1
    where t2.id2 is null
    union
    select t2.*
    from table2 as t2
    inner join table1 as t1a on t1a.id = t2.id1
    inner join table1 as t1b on t1b.id = t2.id2
    Autre solution, mais je ne suis pas sûr de moi:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select t2.*
    from table2 as t2
    inner join table1 as t1a on t1a.id = t2.id1
    left outer join table1 as t1b on t1b.id = t2.id2
    where table2.id2 is null or t1b.id is not null

    Tatayo

  14. #14
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    en fait , pour la requette , j'aimerais bien partir de la table 1 vers la table 2 et pas le contraire car dans le resultat je dois afficher les id de cette facon :

    1 a b service1
    1 a null service4

    donc le l'element de départ sera la table1 ,

    j'ai testé les deux requettes du commentaire précédant mais ca marche pas

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    Citation Envoyé par yassineonline2013 Voir le message
    en fait , pour la requette , j'aimerais bien partir de la table 1 vers la table 2 et pas le contraire car dans le resultat
    je dois afficher les id de cette facon :

    1 a b service1
    1 a null service4

    donc le l'element de départ sera la table1 ,
    Je ne vois pas ce que tu entends par "partir de la table 1".
    En effet, ces deux requêtes sont strictement équivalentes:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select *
    from table1
    inner join table2 on table1.col1 = table2.col1
     
    select *
    from table2
    inner join table1 on table2.col1 = table1.col1

    D'ailleurs en regardant les plans d'exécutions de mes requêtes, je vois souvent que le moteur "réarrange" l'ordre des tables en fonctions de ses stats.

    Quoi qu'il en soit, je pense savoir ce qui ne va pas dans mes deux requêtes (ou alors je n'ai toujours pas compris):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT t2.*
    FROM table2 AS t2
    INNER JOIN table1 AS t1 ON t1.id = t2.id1
    WHERE t2.id2 IS NULL
    union
    SELECT t2.*
    FROM table2 AS t2
    INNER JOIN table1 AS t1a ON t1a.id = t2.id1
    INNER JOIN table1 AS t1b ON t1b.id = t2.id2
    where t1a.code = t1b.code
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t2.*
    FROM table2 AS t2
    INNER JOIN table1 AS t1a ON t1a.id = t2.id1
    LEFT OUTER JOIN table1 AS t1b ON t1b.id = t2.id2 and t1a.code = t1b.code
    WHERE table2.id2 IS NULL OR t1b.id IS NOT NULL

    Il manquait un lien entre t1a et t1b.

    Tatayo.

  16. #16
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Ma requête ne répond pas à ton besoin ?

  17. #17
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Peut-être un début de réponse:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select t2.*
    from table2 as t2
    inner join table1 as t1 on t1.id = t2.id1
    where t2.id2 is null
    union
    select t2.*
    from table2 as t2
    inner join table1 as t1a on t1a.id = t2.id1
    inner join table1 as t1b on t1b.id = t2.id2


    Tatayo
    J'ai un peu changer cette requette pour qu'elle soit adapté à mon besoin ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from table2 as t2
    inner join table1 as t1 on t1.id = t2.id1 and t1.id like '%U'
    where t2.id2 is null
    union
    select t2.*
    from table2 as t2
    inner join table1 as t1a on t1a.id = t2.id1 t1a.id like '%U'
    inner join table1 as t1b on t1b.id = t2.id2 and t1a.code = t1b.code and 
    t1b.id like '%R'
    sauf que je voudrais que dans la premiere sous requette avant l'union ne soit fait que si (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inner join table1 as t1b on t1b.id = t2.id2 and t1a.code = t1b.code and 
    t1b.id like '%R'
    ) n'existe pas et ne retourne rien . Merci pour votre aide

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    Citation Envoyé par yassineonline2013 Voir le message
    sauf que je voudrais que dans la premiere sous requette avant l'union ne soit fait que si (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inner join table1 as t1b on t1b.id = t2.id2 and t1a.code = t1b.code and 
    t1b.id like '%R'
    ) n'existe pas et ne retourne rien . Merci pour votre aide
    Vu que dans la première partie de la requête t2.id2 est null, la jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inner join table1 as t1b on t1b.id = t2.id2 and t1a.code = t1b.code and 
    t1b.id like '%R'
    ne retournera jamais rien, et comme il s'agit d'une jointure interne la requête ne renverra rien non plus.

    Tatayo.

  19. #19
    Membre à l'essai
    Profil pro
    développeur
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Peut-être un début de réponse:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select t2.*
    from table2 as t2
    inner join table1 as t1 on t1.id = t2.id1
    where t2.id2 is null
    union
    select t2.*
    from table2 as t2
    inner join table1 as t1a on t1a.id = t2.id1
    inner join table1 as t1b on t1b.id = t2.id2
    Autre solution, mais je ne suis pas sûr de moi:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select t2.*
    from table2 as t2
    inner join table1 as t1a on t1a.id = t2.id1
    left outer join table1 as t1b on t1b.id = t2.id2
    where table2.id2 is null or t1b.id is not null

    Tatayo
    je pense que je n'est pas bien exprimé mon problème , je voudrais ne faire la première requette que lorsque dans la deuxième requette cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN table1 AS t1b ON t1b.id = t2.id2 AND t1a.code = t1b.code AND 
    t1b.id LIKE '%R'
    ne retourne rien

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/06/2015, 15h33
  2. [XL-2007] Liaison entre classeurs par rapport à la valeur d'une cellule
    Par XceSs dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2013, 15h30
  3. Réponses: 2
    Dernier message: 23/11/2009, 21h11
  4. liaison liste modifiable et valeur par défaut
    Par ra dex dans le forum IHM
    Réponses: 1
    Dernier message: 16/04/2008, 23h19
  5. Réponses: 2
    Dernier message: 05/12/2005, 17h39

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