我想使用 SQL ServerIN
运算符并将变量设置为列值。这可能吗?
我的代码是这样的:
DECLARE @SubkindId as tinyint;
SELECT NAME FROM SampleTable001 WHERE
Id in (SELECT Id, @SubkindId = Subkind FROM SampleTable002)
ORDER BY Name;
我的问题是:我想在内部选择语句中设置 @SubkindId 变量。
我想使用 SQL ServerIN
运算符并将变量设置为列值。这可能吗?
我的代码是这样的:
DECLARE @SubkindId as tinyint;
SELECT NAME FROM SampleTable001 WHERE
Id in (SELECT Id, @SubkindId = Subkind FROM SampleTable002)
ORDER BY Name;
我的问题是:我想在内部选择语句中设置 @SubkindId 变量。
在 SQL Server 中,您不能在同一语句中选择结果集和SET 变量(尽管在 MySQL 中可以)。对不起。但可能有另一种方法可以得到你想要的。不幸的是,你想要什么并不完全清楚。
假设您想要执行 SELECT 并同时将另一个值返回到变量中,您必须处理查询可以返回多行的问题,那么在这种情况下,您希望返回哪一个@SubkindId
?
现在,我可能误解了,而不是尝试将列值拉入变量中,而是只想拉出与变量中已经存在的值SubkindId
匹配的行(尽管您没有首先显示为其分配值,所以这似乎不太可能)。
请确认是哪种情况并回答以上问题,我可以为您提供更多帮助。
同时,我将尝试为您提供两种情况的答案。
首先,让我提一下,我建议不要使用IN()
带有返回 ID 列表的子查询的语法。在我看来这是不好的做法,因为它通常表明该人并不真正知道如何正确 JOIN,并且一旦查询变得有点复杂,不仅该人,甚至最好的专业 SQL Server 查询编写器都可以获得失去了(... WHERE x IN (SELECT ... WHERE y IN (SELECT ... WHERE z NOT IN (...)))
很快就会导致什么严重的情况!?!?!?!. 只需使用 JOIN,如果需要,还可以使用半连接(通过 EXISTS 子句引入)。
如果您真正想要的是访问 SELECT 语句在执行连接时找到的值,它可能看起来像这样:
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.
如果您真的只是想查询而不是返回值,我建议您这样做:
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;
如果 SampleTable002 中有多行但您不希望它们出现在结果集中,则:
SELECT
T1.Name
FROM
dbo.SampleTable001 T1
WHERE
EXISTS (
-- This semi-join requires at least one row to exist
-- but doesn't increase the row count
SELECT *
FROM dbo.SampleTable002 T2
WHERE
T1.Id = T2.Id
AND T2.Subkind = @SubkindId
)
ORDER BY
T1.Name;
我希望这有帮助。
像这样做:
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]