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 :

Problème de jointure peut-être


Sujet :

Langage SQL

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut Problème de jointure peut-être
    Bonjour j'ai deux tables associatives à partir de 3 tables
    T1,T2,T3 les trois tables avec chacune une clé primaire id (id1,id2,id3)
    Deux tables T12 et T23
    T12 est construite ainsi
    id1,id2,rang

    Chaque entité de T1 est une suite ordonnée d'entités de T2

    T23 est construite de la même façon
    id2,id3,rang

    Chaque entité de T2 est une suite ordonnée d'entités de T3

    Je voudrai construire T13
    id1,id3,rang

    Par exemple

    Si on a les lignes suivantes dans T12
    id1 id2 rg
    1200 625 1
    1200 629 2

    Et ces lignes pour T23
    id2 id3 rg
    625 16556 1
    625 16557 2
    625 16558 3
    625 16559 4
    625 16560 5
    625 16561 6
    625 16562 7
    625 16563 8
    625 16564 9
    625 16565 10
    625 16566 11
    625 16567 12
    625 16568 13
    625 16569 14
    629 7614 1
    629 7615 2
    629 7616 3
    629 7617 4
    629 7618 5
    629 7619 6

    Je veux obtenir
    d2 id3 rg
    1200 16556 1
    1200 16557 2
    1200 16558 3
    1200 16559 4
    1200 16560 5
    1200 16561 6
    1200 16562 7
    1200 16563 8
    1200 16564 9
    1200 16565 10
    1200 16566 11
    1200 16567 12
    1200 16568 13
    1200 16569 14
    1200 7614 15
    1200 7615 16
    1200 7616 17
    1200 7617 18
    1200 7618 19
    1200 7619 20
    C'est en respectant les autres que l'on se fait respecter.

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Merci.
    Je l'avais déjà lu mais je ne voyais pas par quel bout prendre le problème. Je vais le relire, peut-être cela me paraîtra plus clair. A plus.
    C'est en respectant les autres que l'on se fait respecter.

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Merci.
    Tu as bien fait de m'indiquer ce cours : j'ai finalement réussi à faire ce que je voulais (à la troisième lecture). Il me reste l'histoire du rang à créer mais je devrai y arriver.
    C'est en respectant les autres que l'on se fait respecter.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 rang n'est pas présent dans votre table ? (quel est votre SGBD ?)

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par Patrice Henrio Voir le message
    Bonjour j'ai deux tables associatives à partir de 3 tables
    T1,T2,T3 les trois tables avec chacune une clé primaire id (id1,id2,id3)
    Deux tables T12 et T23
    T12 est construite ainsi
    id1,id2,rang

    Chaque entité de T1 est une suite ordonnée d'entités de T2

    T23 est construite de la même façon
    id2,id3,rang

    Chaque entité de T2 est une suite ordonnée d'entités de T3

    Je voudrai construire T13
    id1,id3,rang

    Par exemple

    Si on a les lignes suivantes dans T12
    id1 id2 rg
    1200 625 1
    1200 629 2

    Et ces lignes pour T23
    id2 id3 rg
    625 16556 1
    625 16557 2
    625 16558 3
    625 16559 4
    625 16560 5
    625 16561 6
    625 16562 7
    625 16563 8
    625 16564 9
    625 16565 10
    625 16566 11
    625 16567 12
    625 16568 13
    625 16569 14
    629 7614 1
    629 7615 2
    629 7616 3
    629 7617 4
    629 7618 5
    629 7619 6

    Je veux obtenir
    id1 id3 rg
    1200 16556 1
    1200 16557 2
    1200 16558 3
    1200 16559 4
    1200 16560 5
    1200 16561 6
    1200 16562 7
    1200 16563 8
    1200 16564 9
    1200 16565 10
    1200 16566 11
    1200 16567 12
    1200 16568 13
    1200 16569 14
    1200 7614 15
    1200 7615 16
    1200 7616 17
    1200 7617 18
    1200 7618 19
    1200 7619 20
    J'en suis arrivé à cette situation mais je ne sais pas comment finir pour obtenir ce que je veux
    id1 id3 rg
    1200 16556 1
    1200 16557 2
    1200 16558 3
    1200 16559 4
    1200 16560 5
    1200 16561 6
    1200 16562 7
    1200 16563 8
    1200 16564 9
    1200 16565 10
    1200 16566 11
    1200 16567 12
    1200 16568 13
    1200 16569 14
    1200 7614 1
    1200 7615 2
    1200 7616 3
    1200 7617 4
    1200 7618 5
    1200 7619 6
    C'est en respectant les autres que l'on se fait respecter.

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Le rang n'est pas présent dans votre table ? (quel est votre SGBD ?)
    Je ne comprends pas ?
    Le rang esr bien présent dans chacune des tables T12 et T23.
    Mon SGBD est H2
    C'est en respectant les autres que l'on se fait respecter.

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    j'avais lu un peu vite.

    Le problème ici c'est qu'il n'y a pas de logique à votre demande.

    Donc on peut trouver une solution à un cas mais je doute qu'il soit portable pour d'autre cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select id1, id2,
    case when id2 = 625 then rang else rang + 15 end
    from ....
    Si la notion de rang peut être aléatoire, regardez s'il n'y a pas un équivalant à rowNumber dans votre sgbd (une variable qui indique le numéro de ligne dans le select)

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Citation Envoyé par punkoff Voir le message
    j'avais lu un peu vite.

    Le problème ici c'est qu'il n'y a pas de logique à votre demande.

    Donc on peut trouver une solution à un cas mais je doute qu'il soit portable pour d'autre cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select id1, id2,
    case when id2 = 625 then rang else rang + 15 end
    from ....
    Si la notion de rang peut être aléatoire, regardez s'il n'y a pas un équivalant à rowNumber dans votre sgbd (une variable qui indique le numéro de ligne dans le select)
    En fait j'ai créé une table qui comporte toutes les infos nécessaires

    Chaque ligne de ma table comporte
    entité1, entité2, rang de l'entité2 dans l'entité1 (rang21), entité3, rang de l'entité3 dans l'entité2 (rang32)
    Je rajoute la valeur nb3 qui est le nombre d'entité3 dans entité2 (max du rang en fait)
    Je veux rajouter rang de l'entité 3 dans l'entité1 (rang31) qui se calcule de la manière suivante
    Si rang21 = 1 alors rang31 = rang32
    Si rang21 = 2 alors rang31 = nb3(1) + rang32
    Si rang21 = 3 alors rang31 = nb3(1)+nb3(2)+rang32
    .../...
    En procédural ça irait tout seul avec une boucle de lecture et ajoutant 1 à chaque tour et remettant à 0 quand on change d'entité1.
    C'est en respectant les autres que l'on se fait respecter.

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    Bon j'ai fini par trouver.
    Evidemment cela irait tout seul avec un rank() over() mais malheureusement H2 dans la version 1.3 ne connait pas cela. C'est prévu dans la version 1.4.
    Voici donc comment j'ai fait grâce à un rownum (équivalent de ce que proposait punkoff).
    Comme le problème est de créer une nouvelle table pour remplacer deux autres tables j'ai créé autant de tables provisoires (pas la même chose que temporaire)
    que nécessaire, tables que j'effacerai à la fin. Bien entendu à chaque étape j'ai créé les index nécessaires. Pour info une requête simple avec jointure sur la table points sans index 40 minutes, avec index 7 secondes.

    Donc voici le problème dans son intégralité et sa solution si cela peut servir à quelqu'un.
    trois tables d'entité : pourtours, limes, points
    un pourtour est une suite ordonnée de limes parcouru dans un ordre croissant ou décroissant, un limes est une suite ordonnée de points.
    Deux tables d'association
    1. limes_points donne la liste ordonnée des points composant le limes : chaque ligne comporte id_limes, id_point, rang du point dans le limes, la clé primaire est le couple id_limes,rang.
      Un point peut appartenir à plusieurs limes mais n'apparait qu'uen fosi dans chaque limes.
    2. pourtour_limes donne la liste ordonnée des limes composant le pourtour : chaque ligne comporte id_pourtour, id_limes, sens de parcours du limes, rang du limes dans le pourtour, la clé primaire est le couple id_pourtour, rang.
      Un limes peut appartenir à plusieurs pourtour mais n'apparait qu'une fois dans chaque pourtour.

    Je veux obtenir une table pourtours_points qui donnera la liste ordonnée des points composant le pourtour.
    Tout d'abord créer une première table avec toutes les infos par une jointure entre pourtours_limes et limes_points.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE T1 AS 
    (SELECT PL.ID_POURTOUR AS POURTOUR,
           PL.ID_LIMES AS LIMES,
           PL.RANG AS RANG_LIMES,
           PL.SENS AS SENS,
           LP.ID_POINT AS POINT,
           CASE 
               WHEN SENS THEN LP.RANG
               ELSE (SELECT MAX(RANG) FROM LIMES_POINTS AS LP WHERE LP.ID_LIMES = PL.ID_LIMES ) - LP.RANG + 1
           END AS RANG_POINT
    FROM POURTOURS_LIMES AS PL
    JOIN LIMES_POINTS AS LP
    ON PL.ID_LIMES  = LP.ID_LIMES);
    Donc une ligne de T1 est de la forme
    pourtour (l'id d'un pourtour), limes (l'id d'un limes), rang_limes (le rang du limes dans le pourtour), sens (le sens de parcours du limes : rangs croissants ou décroissants), point (l'id d'un point), rang_point (le rang du point dans le limes en tenant compte du sens de parcours : clause case-when-else).
    Je crée une deuxième table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE T2 AS
    (SELECT *, ROWNUM() AS RANG2  FROM (SELECT * FROM T1 ORDER BY POURTOUR ,RANG_LIMES ,RANG_POINT)) ;
    Donc on ordonne les lignes de T2 suivant l'id du pourtour, le rang du limes puis le rang du point. Chaque ligne comporte donc :
    pourtour, limes, rang_limes, sens, point, rang_point, rang2 (le numéro de la ligne).
    Je crée une troisième table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE T3 AS
    (SELECT POURTOUR, MIN(RANG) AS MIN FROM T2
    GROUP BY POURTOUR);
    Chaque ligne de cette table comprend un pourtour, la première ligne où il apparait.
    Enfin je crée une quatrième table T4 qui est le résultat attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE T4 as 
    (SELECT T2.POURTOUR ,T2.POINT , T2.RANG - T3.MIN + 1 AS RANG
     FROM T2
     JOINT T3
     ON T3.POURTOUR = T2.POURTOUR) ;
    Il ne reste plus qu'à
    Effacer (drop) T1,T2,T3,LIMES,POURTOURS_LIMES,LIMES_POINTS
    Renommer T4 en POURTOURS_POINTS
    Créer la clé primaire et les clés étrangères.
    C'est en respectant les autres que l'on se fait respecter.

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

Discussions similaires

  1. Problème parent, notion peut-être mal comprise
    Par Oxygn44 dans le forum Langage
    Réponses: 4
    Dernier message: 13/11/2008, 10h11
  2. Problème réactivation Vista peut-être insoluble?
    Par ombre6 dans le forum Windows Vista
    Réponses: 7
    Dernier message: 28/08/2007, 23h17
  3. problème d'apostrophe peut-être
    Par ballantine's dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2007, 15h07
  4. problème débile peut être dû à une interface
    Par Faiche dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2006, 15h10
  5. Problème de variables peut être pas intialisées
    Par gregory.bts dans le forum Langage
    Réponses: 14
    Dernier message: 12/10/2006, 09h55

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