1
votes

Comment gérer une sous-requête sans résultat?

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 >


0 commentaires

3 Réponses :


0
votes

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


1 commentaires

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.



0
votes

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


0 commentaires

2
votes

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)


8 commentaires

@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 /…