从表中递归插入

时间:2018-01-14 22:37:10

标签: sql stored-procedures sql-server-2016

执行以下操作的有效方法是什么:

我们说我有一张看起来像这样的桌子(dbo.Student):

Date            StudentName   
10-01-2017         Alex K
10-01-2017         Mike J
11-01-2017         John W
12-01-2017         Marie A
12-01-2017         Steph V

我需要将这些记录作为快照插入。所以,我的最终结果将是:

  Cutoff            Date            StudentName   
   10-01-2017      10-01-2017         Alex K
   10-01-2017      10-01-2017         Mike J
   11-01-2017      10-01-2017         Alex K
   11-01-2017      10-01-2017         Mike J
   11-01-2017      11-01-2017         John W
   12-01-2017      10-01-2017         Alex K
   12-01-2017      10-01-2017         Mike J
   12-01-2017      11-01-2017         John W
   12-01-2017      12-01-2017         Marie A
   12-01-2017      12-01-2017         Steph V

因此,对于每个时段获取一个快照,其中Date< =截止日期。

我目前的解决方案如下:

创建如下所示的附加表dbo.Dates:

Dates
10-01-2017
11-01-2017
12-01-2017
01-01-2018
...

然后遍历表日期并运行insert语句:

insert into myTable
select * from dbo.Student where Date<=CutoffDate

问题:插入语句有时执行超过100次。 (我的源表可以有100k-200万行。)因此在循环中运行此逻辑并不理想。我可以在dbo.Dates中拥有多达100-500个日期。

2 个答案:

答案 0 :(得分:0)

如果你有单独的表,你可以一步完成插入:

insert into mytable (cutoff, date, name)
    select t.date, t.date, t.name
    from mytable t join
         dates d
         on d.date >= t.date;

编辑:

如果日期在mytable,您可以执行以下操作:

insert into mytable (cutoff, date, name)
    select t.date, t.date, t.name
    from mytable t join
         (select distinct date from mytable) d
         on d.date >= t.date;

但是,这假设该表只包含您感兴趣的日期。

答案 1 :(得分:0)

试试这个(:

SELECT DateDtls.Date,YourTable.Date,YourTable.StudentName
FROM   YourTable
CROSS JOIN (SELECT   DISTINCT Date FROM   YourTable) AS DateDtls
WHERE YourTable.Date <= DateDtls.Date