2

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

我的代码是这样的:

DECLARE @SubkindId as tinyint;

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

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

4

2 回答 2

2

可以做到吗?

在 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;

我希望这有帮助。

于 2012-08-21T06:17:30.640 回答
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] 
于 2012-08-21T06:17:56.833 回答