Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/03/2011, 22h58   #1
Invité de passage
 
Inscription : mars 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 8
Points : 3
Points : 3
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 :
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 :
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 :
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.
barfoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 08h18   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Bonjour,
Tu peux le faire en construisant dynamiquement la requête:
Code SQL :
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/03/2011, 14h43   #3
Invité de passage
 
Inscription : mars 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 8
Points : 3
Points : 3
D'accord, donc une auto-jointure à construire dynamiquement. Je vais donc prendre cette solution.
Merci beaucoup pour ta réponse !
barfoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h40.


 
 
 
 
Partenaires

Hébergement Web