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
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
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
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)

