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 :

Jointure avec plusieurs enregistrements


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut Jointure avec plusieurs enregistrements
    Bonjour,

    J'ai une table A avec des champs A_ID, A_NAME, A_ID_B et une table B avec les champs B_ID, B_CHAMP1, et je voudrais faire une requête jointure entre A et B où A_ID_B=B_ID.
    Pas de difficulté, sauf que :
    Plusieurs enregistrements de la table B peuvent être liés à un enregistrement de A, et le champ A_ID_B qui stocke les ID des enregistrements de B liés est une chaine de caractères de la forme ID1_B;ID2_B;ID3_B.
    Il faut donc dans la requête SQL 'éclater' cette chaine de caractères suivant le carcatère ';', et ensuite faire la jointure.

    Comment faire ça?

    Merci,
    Nico

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    Comment faire ça?
    En modélisant correctement !
    Il aurait fallu créer une table pour porter la relation entre la table A et la table B, avec pour seules colonnes A_Id et Id_B au lieu de cette colonne A_Id_B.
    Et là, la jointure se fait beaucoup plus simplement...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Je suis d'accord que c'est pourri comme modélisation, mais c'est la base de données d'un logiciel commercial, et je suis donc obligé de le prendre comme c'est ...

    Nico

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Comment un produit commercialisé a-t-il pu modéliser une telle hérésie
    Si le produit est encore maintenu, alors il faut signaler ce cas comme un bug à corriger par l'éditeur, à lui de prendre en charge les défauts du produit qu'il commercialise !

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    En effet, c'est moche

    Vous pouvez tenter un truc dans ce goût là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FROM A
    INNER JOIN B
        ON ';' || A_ID_B || ';' LIKE '%;' || B_ID || ';%'
    Heu... je ne sais plus si je l'ai déjà dit... c'est moche

    Faut pas attendre des performances...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Ça marche presque .

    J'ai cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT RQ_REQ_ID, RQ_REQ_NAME, RQ_TARGET_RCYC_VARCHAR, REL_ID
    FROM REQ
    INNER JOIN RELEASES
    	ON ';' || RQ_TARGET_RCYC_VARCHAR || ';' LIKE '%;' || REL_ID || ';%'
    ORDER BY RQ_REQ_ID
    Ça me zappe toujours la dernière valeur de la liste.
    Exemple :
    j'ai un enregistrement de la table REQ dont la variable RQ_TARGET_RCYC_VARCHAR est égale à ;1001;1002;1003;1005;
    Au final, je devrais donc avoir 4 lignes correspondantes dans la table résultat, mais je n'en ai que 3 avec les ID 1001, 1002, 1003.

    Par contre, si je n'ai qu'un Id au départ (RQ_TARGET_RCYC_VARCHAR de la forme ;1002, j'ai bien un enregistrement correspondant dans la table résultat.

    Mes tables ne sont pas très grosses, donc les performances sont OK.

    Nico

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Quel est le type de la colonne ?

    vous avez peut-être des caractères non visibles (comme des espace, notamment si vous êtes en CHAR) qui empeche le bon fonctionnement de la requete, puisque vous aurez alors quelque chose du genre ;1001;1002;1003;1005 ;Vérifiez ce que donne la concaténation pour vos valeurs

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Je m'étais trompé dans les variables, désolé.
    ça marche nickel !

    Merci,
    Nico

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Si vous utilisez SQL Server, vous pouvez aussi jeter un oeil de ce côté :

    http://www.developpez.net/forums/d14...r/#post7927380
    On ne jouit bien que de ce qu’on partage.

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

Discussions similaires

  1. [AC-2007] [JOINTURES] Condition de jointure avec plusieurs tables
    Par mistertbo dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/03/2011, 11h45
  2. Réponses: 4
    Dernier message: 25/09/2009, 23h54
  3. Réponses: 3
    Dernier message: 31/07/2009, 14h24
  4. Réponses: 0
    Dernier message: 23/07/2009, 15h45
  5. Jointure avec plusieurs résultats
    Par kemenaran dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/12/2005, 23h21

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