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 :

Auto-jointure ou imbrication recursive


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Auto-jointure ou imbrication recursive
    Bonsoir,

    Je ronge un os...
    Je réalise actuellement un module sur un logiciel existant, je ne peux donc modifier la structure de la base.
    La table à laquelle j'accède à la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ATTRIBUTS(#id, id_article, nom_attribut, valeur_attribut)
    Chaque enregistrement correspond à un attribut et sa valeur pour un article donné.
    Un article a plusieurs attributs.
    Mon but est de proposer à l'utilisateur des listes de valeurs à sélectionner pour chaque attributs.
    Les listes doivent être dynamiques. Si l'utilisateur a choisi une valeur dans une première liste,
    la seconde liste (second attribut) ne doit proposer uniquement les valeurs pour lesquelles la combinaison existe.

    Exemple dans la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    id - id_article - nom_attribut - valeur_attribut
    --------------------------------------------------------------------
    1     23             attr1               1 
    2     23             attr2               12
    3     36             attr1               1
    4     36             attr2               6
    5     58             attr1               1
    6     58             attr2               8
    7     79             attr1               2
    8     79             attr2               4
    Exemple de liste :

    Si je choisi la valeur 1 pour l'attribut attr1, dans la seconde liste je dois avoir :

    Pas compliqué vous me direz :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * from table WHERE id_article IN 
    (SELECT id_article FROM table WHERE nom_attribut='attr1' and valeur_attribut = 1);
    Voir une auto-jointure... je ne sais pas si c'est une bonne solution je ne suis pas très calé dans le domaine.

    Mais le gros soucis c'est que mon exemple se base sur 2 attributs différents, or en réalité il peut y en avoir bien plus. Et je ne sais pas à l'avance combien. Et je ne suis pas sur que ça soit très efficace d'imbriquer et d'imbriquer encore des requêtes... Surtout qu'elle sera soumise à bonne charge.

    Existe-t'il un moyen plus propre d'obtenir ce résultat sans modifier la structure de la table ? Je sèche ...

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 203
    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 203
    Points : 12 781
    Points
    12 781
    Par défaut
    Bonjour,
    Tu peux le faire en construisant dynamiquement la requête:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select T1.* from matable t1
    inner join matable t2 on t1.idarticle = t2.idarticle and t2.nomattribut = xx and t2.valeurattribut=yy
    La deuxième ligne est à répéter autant de fois que nécessaire, en modifiant l'alias et les critères bien sûr.

    Pour ce qui est de la performance, avec les bons indexes ça doit le faire.

    Tatayo.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    D'accord, donc une auto-jointure à construire dynamiquement. Je vais donc prendre cette solution.
    Merci beaucoup pour ta réponse !

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

Discussions similaires

  1. Requête avec auto jointure récalcitrante
    Par vmolines dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/03/2006, 21h31
  2. Auto jointure complexe
    Par ricobye dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/01/2006, 16h02
  3. Trier la hierarchie d'une auto-jointure
    Par Oberown dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/10/2005, 16h18
  4. resultat d'une auto jointure
    Par slc dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/09/2004, 13h54
  5. Auto jointure speciale
    Par kv000 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/04/2004, 13h02

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