SQL Server – Utilisation de variables dans la clause 'IN' provenant d'une requête de sélection

DECLARE @ID SMALLINT = (SELECT ID FROM ABD WHERE Name IN ('myName','yourName') ); SELECT * FROM XYZ WHERE ID IN (@ID) 

Veuillez suggérer comment utiliser une variable dans la clause 'IN' dans SQL SERVER pour le scénario ci-dessus. Je sais que ce n'est pas la bonne façon. il y avait une question similaire avec un scénario différent, donc je ne pouvais pas get beaucoup d'aide de là aussi. Merci!

La meilleure approche serait d'utiliser une jointure à la place. Ce que vous essayez de faire ne va pas au travail.

 SELECT * FROM XYZ x join ABD a on a.ID = x.ID where a.Name in ('myName', 'yourName') 

Une variable ne peut stocker qu'une seule valeur. Vous pouvez vous débarrasser de la variable et faire une sous-requête dans la clause IN comme ceci:

 SELECT * FROM XYZ WHERE ID IN ( SELECT ID FROM ABD WHERE Name IN ('myName','yourName') ) 

Ou cette sous-requête avec l'utilisation de EXISTS , qui est préférée à IN dans la plupart des cas parce que la sous-requête returnnera chaque ligne pour la clause IN tandis que EXISTS quittera la sous-requête tôt quand la condition sera remplie:

 SELECT * FROM XYZ x WHERE EXISTS ( SELECT a.ID FROM ABD a WHERE a.Name IN ('myName','yourName') AND a.ID = x.ID ) 

Ou vous pouvez faire une INNER JOIN avec l'autre table comme ceci:

 SELECT x.* FROM XYZ x INNER JOIN ABD a ON a.ID = x.ID WHERE a.Name IN ('myName','yourName') 

Le x.* Veillera à ce que vous ne renvoyiez que des données de la table XYZ. Cela fournira également de meilleures performances que l'utilisation de sous-requêtes dans la plupart des cas.