web 2.0

Un petit Challenge SQL

Bonjour a tous,

Aujourd'hui je vais vous proposer un petit Challenge SQL : Faire une requête inversée

Considérons le schéma de base de données suivant

image

Simple vous me direz, il n'y a que 3 tables ? :)

Maintenant voici le sujet :

Nous souhaitons obtenir un ProductDeclinationId pour la combinaison de ProductAttributeId choisie si et seulement si la combinaison totale des ProductAttributeId est remplie.

A noter que le nombre de ProductAttributeId choisi peut etre indéfini (ne donc pas se baser que sur 2 ProductAttributeId, cela doit fonctionner si l'on passe 2,3,4 etc.. ProductAttributeId)

Voici les combinaisons de ProductAttributeId disponibles

ProductDeclinationId = 3

SELECT     
        T_ProductAttributes.ProductAttributeId, 
        T_ProductAttributes.Name
FROM    T_ProductAttributes 
INNER JOIN T_ProductAttributeCombinations 
ON T_ProductAttributes.ProductAttributeId = T_ProductAttributeCombinations.ProductAttributeId 
INNER JOIN    T_ProductDeclinations 
ON T_ProductAttributeCombinations.ProductDeclinationId = T_ProductDeclinations.ProductDeclinationId
WHERE T_ProductDeclinations.ProductDeclinationId = 3

 image

ProductDeclinationId = 4

SELECT     
        T_ProductAttributes.ProductAttributeId, 
        T_ProductAttributes.Name
FROM    T_ProductAttributes 
INNER JOIN T_ProductAttributeCombinations 
ON T_ProductAttributes.ProductAttributeId = T_ProductAttributeCombinations.ProductAttributeId 
INNER JOIN    T_ProductDeclinations 
ON T_ProductAttributeCombinations.ProductDeclinationId = T_ProductDeclinations.ProductDeclinationId
WHERE T_ProductDeclinations.ProductDeclinationId = 4

image

 

La solution évidente qui pourrait nous venir a l'esprit serai de faire le code suivant

SELECT  T_ProductDeclinations.ProductDeclinationId,
        T_ProductAttributes.ProductAttributeId, 
        T_ProductAttributes.Name
FROM    T_ProductAttributes 
INNER JOIN T_ProductAttributeCombinations 
ON T_ProductAttributes.ProductAttributeId = T_ProductAttributeCombinations.ProductAttributeId 
INNER JOIN    T_ProductDeclinations 
ON T_ProductAttributeCombinations.ProductDeclinationId = T_ProductDeclinations.ProductDeclinationId

WHERE T_ProductAttributes.ProductAttributeId = 1 OR T_ProductAttributes.ProductAttributeId = 3

 

Malheureusement le "OR" ne permet pas de remplir notre condition du sujet car si nous mettons juste le ProductAttributeId = 1 cela nous retourne quand meme le ProductDeclinationId (3) aulieu de nous retourner NULL car il n'y a pas de combinaison possible avec seulement le ProductAttributeId = 1 .

Snif :( a proscrire donc ..

Question : Est-ce possible d'effectuer cette requete en 1 seule requete et non en procédure avec tables temporaires etc.. ?

 

J'attend vos suggestions :)

 

Vous pouvez télécharger le script de création des tables avec données ici : Script.sql (8,78 kb)

 

yield return this;




Views(640)

kick it on DotNetKicks.com

Share/Save/Bookmark Subscribe

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

T-SQL

Comments

Technorati Profile