执行以下操作的有效方法是什么:
我们说我有一张看起来像这样的桌子(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个日期。
答案 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