【问题标题】:How can i duplicate records with T-SQL and keep track of the progressive number?如何使用 T-SQL 复制记录并跟踪累进数?
【发布时间】:2019-11-18 13:53:09
【问题描述】:

如何复制 table1 的记录并将它们与从 startnum 和 endnum 计算的累进数一起存储在 table2 中? 谢谢

第一行必须重复 4 条记录,即 num: 80,81,82,83

Startnum |      Endnum |    Data
---------+-------------+----------
      80 |          83 |    A
      10 |          11 |    C
      14 |          16 |    D

结果:

StartEndNum |   Data
------------+-----------
         80 |   A
         81 |   A
         82 |   A
         83 |   A
         10 |   C
         11 |   C
         14 |   D
         15 |   D
         16 |   D

【问题讨论】:

    标签: sql sql-server database loops tsql


    【解决方案1】:

    一个简单的方法使用递归 CTE:

    with cte as 
          select startnum, endnum, data
          from t
          union all
          select startnum + 1, endnum, data
          from cte
          where startnum < endnum
         )
    select startnum, data
    from cte;
    

    如果您的范围超过 100,则需要 option (maxrecursion 0)

    注意:还有其他解决方案,使用数字表(内置或生成)。我喜欢这个解决方案,作为对递归 CTE 的温和介绍。

    【讨论】:

      【解决方案2】:

      没有递归:

      declare @t table(Startnum int, Endnum int, Data varchar(20))
      insert into @t values
      (80, 83, 'A'),
      (10, 11, 'C'),
      (14, 16, 'D');
      
      
      select a.StartEndNum, t.Data
      from @t t cross apply (select top (t.Endnum - t.Startnum + 1) 
                                         t.Startnum + row_number() over(order by getdate()) - 1 as StartEndNum
                           from sys.all_columns) a;
      

      您可以使用任何其他具有足够行数的表来代替sys.all_columns

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-07
        • 1970-01-01
        相关资源
        最近更新 更多