Bonjour à tous,
J'ai besoin de votre aide concernant une requête multi critères.
Voici le schéma conceptuel d'un catalogue de composants attaché en pièce jointe avec un jeux de données également en pièce jointe.
Ce schéma permet en autre de gérer les règles métiers suivantes :
- «Un composant peut posséder plusieurs propriétés»
- «Plusieurs composants peuvent partager une même propriété»
- «Une propriété peut être monovaluée ou multivaluée »
J'ai besoin d'extraire la liste des composants répondant à certains critères. Par exemple, je souhaiterai extraire les composants de type ramchip qui possèdent les propriétés type et size, propriétés pour lesquelles les valeurs sont respectivement DDR SDRAM et 1024 .
Pour simplifier le problème je limite la recherche aux éléments possédant les propriétés type et size quelque soit leurs valeurs.
J'arrive a extraire les composants propriété par propriété en lançant plusieurs requêtes. Par exemple la requête suivante :
me renvoie bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 select distinct cp.cp_id from cp as cp inner join cp_type as cp_t on cp.cp_type_id = cp_t.cp_type_id inner join cp_prties as prties on cp.cp_id = prties.cp_id where cp_t.cp_type_id = "ramchip" and prties.prty_id = "type"
- ram01
- ram03
- ram04
mais dés je cumule les critères comme suit la requête ne me renvoie rien :
Je suppose que l'on ne peut pas effectuer une jointure sur plusieurs critères portant sur une même colonne et je ne voit pas comment contourner ce problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 select distinct cp.cp_id from cp as cp inner join cp_type as cp_t on cp.cp_type_id = cp_t.cp_type_id inner join cp_prties as prties on cp.cp_id = prties.cp_id where cp_t.cp_type_id = "ramchip" and prties.prty_id = "type" and prties.prty_id = "size"
J'arrive à obtenir les résultats escomptés mais au prix d'un requête plutôt tarabiscotée :
Verriez-vous un autre moyen plus propre ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Select distinct cp.cp_id From cp as cp, cp_prties as prties Where cp.cp_type_id = "ramchip" and prties.cp_id = cp.cp_id and prties.prty_id = "type" and cp.cp_id in (Select distinct cp.cp_id From cp as cp, cp_prties as prties Where cp.cp_type_id = "ramchip" and prties.cp_id = cp.cp_id and prties.prty_id = "size")
D'autant plus que l'exemple traite un cas simple avec seulement 2 critères alors que leur nombre devrait être + important dans l'application finale.
Un grand merci d'avance,
Nico
Partager