我想使用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变量。
答案 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 (...)))
如果你真的只是想查询而不是返回一个值,这就是我的建议:
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]