MS SQL-实现循环的最佳方法

MS SQL-实现循环的最佳方法,sql,sql-server,optimization,stored-procedures,Sql,Sql Server,Optimization,Stored Procedures,现有对象和内容 有一个名为history\u master的表,它记录每次更新名为master的特定表时的情况。它就像一个主桌的历史。主表仅包含最新数据 举例说明内容 主表 | id | item no| valid from | valid till | | 1 | 1 | 2012-12-25 | 2012-12-31 | | 2 | 1 | 2013-01-01 | 2013-04-30 | | 3 | 2 | 2013-01-10 | 2013-1

现有对象和内容

有一个名为history\u master的表,它记录每次更新名为master的特定表时的情况。它就像一个主桌的历史。主表仅包含最新数据

举例说明内容

主表

| id | item no| valid from | valid till | | 1 | 1 | 2012-12-25 | 2012-12-31 | | 2 | 1 | 2013-01-01 | 2013-04-30 | | 3 | 2 | 2013-01-10 | 2013-12-31 | |id |项目编号|有效期为|有效期至| | 1 | 1 | 2012-12-25 | 2012-12-31 | | 2 | 1 | 2013-01-01 | 2013-04-30 | | 3 | 2 | 2013-01-10 | 2013-12-31 | 历史大师看起来像

| id | item no | valid from | valid till | update date | | 1 | 1 | 2012-01-01 | 2012-06-30 | 2012-02-01 | | 2 | 1 | 2012-07-01 | 2012-12-31 | 2012-02-01 | | 3 | 1 | 2012-01-01 | 2012-06-30 | 2012-05-01 | | 4 | 1 | 2012-07-01 | 2012-11-30 | 2012-05-01 | | 5 | 1 | 2012-12-01 | 2012-12-31 | 2012-05-01 | | 6 | 1 | 2012-07-01 | 2012-11-30 | 2012-08-01 | | 7 | 1 | 2012-12-01 | 2012-12-24 | 2012-08-01 | | 8 | 1 | 2012-12-25 | 2012-12-31 | 2012-08-01 | |id |项目编号|有效期为|有效期至|更新日期| | 1 | 1 | 2012-01-01 | 2012-06-30 | 2012-02-01 | | 2 | 1 | 2012-07-01 | 2012-12-31 | 2012-02-01 | | 3 | 1 | 2012-01-01 | 2012-06-30 | 2012-05-01 | | 4 | 1 | 2012-07-01 | 2012-11-30 | 2012-05-01 | | 5 | 1 | 2012-12-01 | 2012-12-31 | 2012-05-01 | | 6 | 1 | 2012-07-01 | 2012-11-30 | 2012-08-01 | | 7 | 1 | 2012-12-01 | 2012-12-24 | 2012-08-01 | | 8 | 1 | 2012-12-25 | 2012-12-31 | 2012-08-01 | 手头的任务:编写一个存储过程,从保留最新数据的历史记录中获取项目的所有可用数据,即结果如下

| item no | valid from | valid till | history_id | | 1 | 2012-12-25 | 2012-12-31 | 8 | | 1 | 2012-12-01 | 2012-12-24 | 7 | | 1 | 2012-07-01 | 2012-11-30 | 6 | | 1 | 2012-01-01 | 2012-06-30 | 3 | |项目编号|有效期自|有效期至|历史| id| | 1 | 2012-12-25 | 2012-12-31 | 8 | | 1 | 2012-12-01 | 2012-12-24 | 7 | | 1 | 2012-07-01 | 2012-11-30 | 6 | | 1 | 2012-01-01 | 2012-06-30 | 3 | 我想到的逻辑是从历史表中确定批次。例如,更新日期为2012-08-01的记录批次为3,更新日期为2012-05-01的记录批次为2,更新日期为2012-08-01的记录批次为1

从最新(3)到最旧(1)迭代所有批次,比较日期范围并确定结果,记住最新集合的数据将始终具有优先级

我能想到的唯一实现方法是WHILE循环,我不确定这是否是最好的方法


到目前为止,历史记录母版包含10155734条记录。请建议

我想您应该将更新日期放入这样一个临时表中

select distinct [update date], identity(int, 1,1) history_id 
into #updatedates
order by [update date]
update date history_id
2012-08-01  1
2012-09-01  2
2012-10-01  3
这给你一张这样的桌子

select distinct [update date], identity(int, 1,1) history_id 
into #updatedates
order by [update date]
update date history_id
2012-08-01  1
2012-09-01  2
2012-10-01  3
然后将其与原始表合并以获得结果

select mh.[item no], mh.[vaild from], mh.[valid to], u.history_id
from master_history mh join #updatedates u on mh.[update date] = u.[update date]

为什么需要存储过程。这应该可以用一条SQL语句来解决。这两个表之间的关系是什么?我在history\u master中看不到类似master\u id的内容,item\u id也不是唯一的。SQL是一种面向集合的语言—您可以构造查询,说明如何处理输入集合,服务器会找出实现这一点的最佳方法,并生成输出集合。通常应避免循环。1000万行并不算大。@How是一匹没有名字的马?@Dutow这两个表之间没有外键约束。项目号不是唯一的,因为它不是主键。它是一个我们有多个日期范围的对象。只有最新的一个大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师级大师