J'essaie de créer une requête en utilisant une sous-requête dans ma condition WHERE, et lorsque la table de sous-requête est vide, je souhaite en fait n'appliquer aucun filtre à ma requête et obtenir toutes les entrées.
Comment puis-je y parvenir ce que je veux?
Voici ma requête:
SELECT m.Material, p.Plant FROM dbo.AllPlants AS p JOIN dbo.AllMaterials AS m ON p.MaterialID = m.MaterialID WHERE p.Plant IN ( SELECT Plant FROM dbo.MyFavoritePlants);
Si je n'ai pas de plantes préférées, je veux toutes les plantes!
p >
3 Réponses :
Au lieu d'une sous-requête, vous pouvez utiliser JOINT GAUCHE . Donc, s'il n'y a pas d'entrée dans la table MyFavoritePlants , il ignorera la condition LEFT JOIN .
SELECT m.Material,
p.Plant
FROM dbo.AllPlants AS p
JOIN dbo.AllMaterials AS m ON p.MaterialID = m.MaterialID
LEFT JOIN dbo.MyFavoritePlants FP ON FP.Plant = p.Plant
Ce n'est pas ce qu'ils veulent. Ils ne veulent que les plantes préférées si elles existent, sinon ils veulent toutes les plantes.
Je n'ai pas encore assez de réputation pour commenter, mais cela pourrait fonctionner
SELECT m.Material, p.Plant FROM dbo.AllPlants AS p JOIN dbo.AllMaterials AS m ON p.MaterialID = m.MaterialID LEFT JOIN dbo.MyFavoritePlants FP ON FP.Plant = P.Plant
Vous pouvez ajouter une deuxième condition pour gérer ce scénario:
SELECT m.Material, p.Plant FROM dbo.AllPlants AS p JOIN dbo.AllMaterials AS m ON p.MaterialID = m.MaterialID WHERE p.Plant IN (SELECT Plant FROM dbo.MyFavoritePlants) OR NOT EXISTS (SELECT 1 FROM dbo.MyFavoritePlants)
@SeanLange Yup, mais j'étais un peu plus rapide :)
@SeanLange Je pense que celui-ci est plus efficace.
@AdnanSharif J'avais le sentiment que les gens penseraient cela. Curieux, pourquoi dites-vous cela? Parce que j'avais select * dans le existe? C'est un malentendu courant. Peu importe ce qui est utilisé pour existe, il recherche des lignes. Vous pouvez le prouver facilement en utilisant select 1/0 dans votre existe et cela fonctionne très bien. :)
@AdnanSharif En fait, pour EXISTS, il n'y a pas de différence entre SELECT * et SELECT 1 ou SELECT col . L'optimiseur de requêtes est conscient de ces scénarios, c'est donc une question de goût :)
@SeanLange Parce que vous avez utilisé * au lieu de 1 . Pas trop de différence, cependant.
@LukaszSzozda Je ne le savais pas. Merci. :)
Merci, je vais essayer de vous le faire savoir.
@FAlvarez meta.stackexchange.com/ questions / 5234 /…