SQL Server中的while循环选择

时间:2018-11-15 18:56:10

标签: sql sql-server while-loop

我确定这很容易,但是在SQL Server Management Studio v17.4中运行它时仍然出现语法错误。

我有一个表T1,上面有序列号,我只需要遍历并检查它们在T2中出现了多少次。我尝试过

declare @serial int

select @serial = select serial from T1

while @serial
begin
    select count(*) from T2 where Serial = @serial
end

但是我得到一个错误:

  

关键字“选择”附近的语法不正确

该怎么做?谢谢。

5 个答案:

答案 0 :(得分:2)

代替while循环,只需联接表并使用聚合即可。 像这样:

select a.serial, count(a.serial) from t2 a
inner join t1 b on b.serial = a.serial
group by a.serial

没有示例数据,我无法为您进行测试,但这将为您带来更好的结果。

答案 1 :(得分:2)

简单

   SELECT T1.Serial,
          COUNT(T2.Serial) AppearsInT2
    FROM T1 JOIN T2 ON T1.Serial = T2.Serial
    GROUP BY T1.Serial

无需声明变量或使用循环。

如果要为第二个表中不存在的序列返回0,请使用LEFT JOIN

SELECT T1.Serial,
       COUNT(T2.Serial) AppearsInT2
FROM T1 LEFT JOIN T2 ON T1.Serial = T2.Serial
GROUP BY T1.Serial;

Simple Demo

答案 2 :(得分:1)

首先,要做:

select @serial = select serial from T1

while @serial

…

并不意味着它会开始为serial的每个T1值神奇地循环,它只会将一个serial值分配给您的变量(如果无论如何它都是正确写入的,{ {1}}。

您想要的内容并不是真正意义上的循环执行; sql是按集合工作的,因此您应该尝试相应地编写代码。在这种情况下,应该执行一个简单的select @serial = serial from T1

JOIN

答案 3 :(得分:1)

是的,这是语法错误

select @serial = select 来自T1的序列; -错误,如下所述

从T1选择@serial = serial;

这将从表T1中选择第一个值。

这将消除错误,但编写的查询不会收集所需的输出。

您需要遍历表T1并针对T2中的每个T1值进行搜索。

看看下面的简单查询是否有帮助

从T1上的T1内部连接T2选择序列,将count(Serial)作为SerilaCount.serial = T2.Serial 按T1.serial分组。

答案 4 :(得分:1)

似乎您可以在一个快速语句中完成此操作,而不是循环。

SELECT T2.Serial, Count(T2.Serial) as NumOfSerial
FROM T1 
    INNER JOIN T2 ON T1.Serial = T2.Serial
GROUP BY T2.Serial