我确定这很容易,但是在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
但是我得到一个错误:
关键字“选择”附近的语法不正确
该怎么做?谢谢。
答案 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;
答案 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