【问题标题】:while loop select in SQL ServerSQL Server 中的 while 循环选择
【发布时间】:2019-04-18 22:53:02
【问题描述】:

我确信这很简单,但是当我在 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

但我得到一个错误:

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

怎么做?谢谢。

【问题讨论】:

  • 你就不能SELECT COUNT(*) FROM T2 WHERE Serial = @Serial吗?
  • 不,有些连续剧重复了。我需要找出在 T2 中重复的那些。
  • 您是否在从您的 T1 表中获取这些序列号的列表,而它们在您的 T2 表中不止一次出现?

标签: sql sql-server while-loop


【解决方案1】:

而不是while循环,只需加入表并使用聚合。 比如:

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

如果没有样本数据,我无法为您进行测试,但这对您来说会更好。

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

      首先,做:

      select @serial = select serial from T1
      
      while @serial
      
      …
      

      并不意味着它会开始神奇地循环 T1 具有的每个 serial 值,它只会为您的变量分配一个串行值(如果它无论如何都正确写入 select @serial = serial from T1)。

      你想要的东西在循环中做是没有意义的; sql 成组工作,您应该尝试相应地编写代码。在这种情况下,一个简单的JOIN 应该这样做:

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

      【讨论】:

        【解决方案4】:

        是的,这是一个语法错误

        select @serial = select 从 T1 串行; -- 错了应该写在下面

        从 T1 中选择 @serial = 串行;

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

        这将消除错误,但写入的查询不会产生所需的输出。

        您需要遍历表 T1 并在 T2 中搜索 T1 的每个值。

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

        select serial, count(Serial) as SerilaCount from T1 inner join T2 on T1.serial =T2.Serial 按 T​​1.serial 分组。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2020-03-01
            • 2018-10-28
            • 2021-09-22
            • 2013-08-29
            • 2010-12-25
            • 2018-02-12
            • 2018-06-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多