返回一个行集并在SQL Server的“IN”子句中设置一个变量

时间:2012-08-21 06:16:18

标签: sql sql-server-2008 tsql

我想使用SQL Server IN运算符,并将变量设置为列值。这可能吗?

我的代码是这样的:

DECLARE @SubkindId as tinyint;

SELECT NAME FROM SampleTable001 WHERE 
Id in (SELECT Id, @SubkindId = Subkind FROM SampleTable002)
ORDER BY Name;

我的问题是:我想在内部select语句中设置@SubkindId变量。

2 个答案:

答案 0 :(得分:2)

可以完成吗?

在SQL Server中,您无法在同一语句中选择结果集 SET变量(尽管您可以在MySQL中)。抱歉。但是可能有另一种方法来获得你想要的东西。不幸的是,你想要的并不完全清楚。

假设您想要执行SELECT并同时将另一个值返回到变量中,您必须处理查询可以返回多行的问题,因此在这种情况下,您希望返回哪一行{ {1}}?

现在,我可能误解了,而不是试图将列值拉入变量,而是只想拉出@SubkindId 匹配的行< / em>变量中已有的值(虽然你没有先显示为它赋值,所以这似乎不太可能)。

请确认是哪种情况并回答上述问题,我可以为您提供更多帮助。

与此同时,我会尝试为这两种情况提供答案。

首先,我要提一下,我建议不要使用SubkindId语法和子查询返回ID列表。在我看来这是很糟糕的做法,因为它通常表明该人并不真正知道如何正确加入,并且一旦查询变得有点复杂,不仅是那个人,甚至是最好的专业SQL Server查询编写者都可以获得丢失IN()很快就会导致什么的严重情况!?!?!?!。只需使用JOIN,如果需要,可以使用半连接(使用EXISTS子句引入)。

查询并返回值

如果你真正想要的是访问SELECT语句在进行连接时找到的值,它可能看起来像这样:

(... WHERE x IN (SELECT ... WHERE y IN (SELECT ... WHERE z NOT IN (...)))

Just Query

如果你真的只是想查询而不是返回一个值,这就是我的建议:

DECLARE @KindsAndSubkinds TABLE (
   Name varchar(100),
   SubkindId tinyint
);

INSERT @KindsAndSubkinds
SELECT
   T1.Name,
   T2.SubkindId
FROM
   dbo.SampleTable001 T1
   INNER JOIN dbo.SampleTable002 T2
      ON T1.Id = T2.Id

SELECT DISTINCT Name
FROM @KindsAndSubkinds
ORDER BY Name;

-- Now you can something with the `SubkindId`s in the @KindsAndSubkinds table variable.

如果SampleTable002中有多行,但您不希望它们出现在结果集中,那么:

DECLARE @SubkindId as tinyint;
SET @SubkindId = 5;

SELECT
   T1.Name
FROM
   dbo.SampleTable001 T1
   INNER JOIN dbo.SampleTable002 T2
      ON T1.Id = T2.Id
WHERE
   T2.Subkind = @SubkindId
ORDER BY
   T1.Name;

我希望这会有所帮助。

答案 1 :(得分:0)

这样做:

DECLARE @SubkindId as tinyint

SELECT [NAME] 
FROM SampleTable001 
WHERE  Id in (SELECT Id 
              from SampleTable002
              WHERE Subkind=@SubkindId)
order by [Name] 

或使用JOIN

DECLARE @SubkindId as tinyint

SELECT [NAME] 
FROM SampleTable001 a 
        INNER JOIN  SampleTable002 b
          ON a.id = b.id
WHERE b.Subkind=@SubkindId
order by [Name]