J'essaie de sélectionner un ensemble de résultats différents pour un produit en fonction d'un type de produit. Donc, si mon produit devrait être un livre, je souhaite qu'il recherchera l'UPC et l'artiste pour un produit normal, ces détails sont toutefois désactivés et pour un autre produit, je voudrais un ensemble de résultats complètement différent.
SELECT CASE Product.type_id
WHEN 10 THEN (
SELECT
Product.product_id,
Product.type_id,
Product.product_name,
Product.UPC,
Product_Type.type,
CONCAT_WS(' ' , first_name, middle_name, last_name ) AS artistC
FROM Product, Product_Type, Product_ArtistAuthor
WHERE Product.type_id = Product_Type.type_id
AND Product.product_id = $pid
AND Product.artist_id = Product_ArtistAuthor.artist_id
)
ELSE (
SELECT
Product.product_id,
Product.type_id,
Product.product_name,
Product_Type.type
FROM Product, Product_Type
WHERE Product.type_id = Product_Type.type_id
AND Product.product_id = $pid
)
END
FROM Product
WHERE Product.product_id = $pid
4 Réponses :
Pour un démarrage, le premier SELECT compte 6 colonnes et la seconde dispose de 4 colonnes. Peut-être faire les deux avoir le même nombre de colonnes (ajoutant des nulls?). P>
Vous pouvez essayer l'autre format pour l'instruction de cas voir http://msdn.microsoft.com/en-us/library/ms181765.aspx Pour plus d'informations. P> P>
C'est vraiment mauvais pour la performance. Vous devez plutôt utiliser une jointure, sinon chaque fois que cette requête fonctionne, elle ferait une autre sélection pour chaque ligne. Très cher. S'il vous plaît voir la solution alternative ci-dessous.
J'ai fini par laisser les propriétés communes des requêtes SELECT et effectuez une seconde requête de sélection ultérieure sur la page. J'ai utilisé une commande PHP si commande pour appeler pour différents scripts en fonction de la première requête SELECT, les scripts contenaient la deuxième requête SELECT. p>
Vous devez éviter d'utiliser des sélectionnées imbriquées et j'irais aussi loin que vous ne devez jamais les utiliser dans la partie sélectionnée de votre relevé. Vous allez exécuter ce choix pour chaque ligne renvoyée. C'est une opération très coûteuse. Utilisez plutôt des jointures. Il est beaucoup plus lisible et la performance est bien meilleure.
Dans votre cas, la requête ci-dessous devrait aider. Notez que la déclaration des cas est toujours là, mais maintenant, il s'agit d'une simple opération de comparaison. P>
select
p.product_id,
p.type_id,
p.product_name,
p.type,
case p.type_id when 10 then (CONCAT_WS(' ' , first_name, middle_name, last_name )) else (null) end artistC
from
Product p
inner join Product_Type pt on
pt.type_id = p.type_id
left join Product_ArtistAuthor paa on
paa.artist_id = p.artist_id
where
p.product_id = $pid
Mettre le SQL dans violon - sqlfiddle.com