SQL Server-在' IN'中使用变量来自select查询的子句

时间:2015-08-20 20:17:48

标签: sql-server

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

请建议如何在' IN'中使用变量。上述场景中 SQL SERVER 中的子句。 我知道这不是正确的方法。有一个类似的问题与不同的情况,所以也无法从那里得到很多帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

最好的方法是使用连接。你想做的事情是行不通的。

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

答案 1 :(得分:1)

变量只能存储1个值。您可以删除变量并在IN子句中执行子查询,如下所示:

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

或者使用EXISTS的子查询,在大多数情况下优先于IN,因为其中的子查询将返回IN子句的每一行EXISTS }当条件满足时,它将提前退出子查询:

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

或者您可以使用另一个表格INNER JOIN执行此操作:

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

x.*将确保您只返回XYZ表中的数据。在大多数情况下,这也将比使用子查询提供更好的性能。