【发布时间】:2012-02-26 06:29:00
【问题描述】:
我问了一个非常相似的问题here,但我现在需要更高级的查询。情况是,我们有大约 20,000 条客户记录。客户可以续订,我们只需为其创建新记录。没有确切的追溯记录实际更新。现在我们添加了old ID 字段,我想用确切的旧记录填充它。现在如果它更新一次,那已经解决了我的老问题,我可以做到。问题是如果一条记录被更新了 3 次或更长时间,我必须找到最旧记录如何跳到最新记录的确切逻辑。为此,我们没有固定的规则,但通常我遵循customer start date(ID 本身会发出一些信息),现在将使用customer start date 填充所有记录。我在这里包含了一个测试用例
create table #customer (
id int not null primary key identity,
cust_no varchar(12),
meter_no varchar(10),
startdate smalldatetime,
enddate smalldatetime,
oldid int null
)
insert into #customer values('AA111222','1111','2008-01-01', '2008-03-01',null)
insert into #customer values('AA111222','1111','2009-02-01', '2009-05-01',null)
insert into #customer values('AA111222','1111','2008-03-01', '2008-12-01',null)
insert into #customer values('AA111222','1111','2009-05-01', '2009-07-01',null)
insert into #customer values('AA111222','1111','2009-08-01', '2009-11-01',null)
insert into #customer values('AA111222','1111','2010-01-01', '2010-04-01',null)
insert into #customer values('AA111222','1111','2010-07-01', '2011-07-01',null)
insert into #customer values('AA111222','1111','2011-03-01', '2011-07-01',null)
insert into #customer values('AA111222','1111','2011-07-01', '2012-07-01',null)
-- I want this result in the last column
id cust_no meter_no startdate enddate oldid
---- ------------ ---------- -------------- -------------- -------
1 AA111222 1111 2008-01-01 2008-03-01 base
2 AA111222 1111 2009-02-01 2009-05-01 3
3 AA111222 1111 2008-03-01 2008-12-01 1
4 AA111222 1111 2009-05-01 2009-07-01 2
5 AA111222 1111 2009-08-01 2009-11-01 4
6 AA111222 1111 2010-01-01 2010-04-01 5
7 AA111222 1111 2010-07-01 2011-07-01 6
8 AA111222 1111 2011-03-01 2011-07-01 7
9 AA111222 1111 2011-07-01 2012-07-01 8
请注意,我们很欣赏不同的做法,所以我也可以学到一些东西。到目前为止,我已经研究了 CTE、Join、Cursor,但如果我能做到的话,我需要一些时间才能做到。
【问题讨论】:
-
我不明白你到底想要什么结果。你想查询表吗,你粘贴了。还是特定的列?
-
哦,忘了所有领域。在我发布的输出中,所有列都是原始的。我想要更改/更新的唯一列是 OLDID。其余的只是查询的一部分。 不需要在那里吗。
-
@Thecrocodilehunter 我不明白
oldid是如何填充的,它的规则是什么?没有规则是不可能分配任何东西的。你的例子是怎么做的? -
更新记录时,其所有基本内容都会复制到新记录中。因此,在上面的示例代码中,
cust_no和meter_no延续到新记录(在实际表中,更多记录),但新记录的客户startdate不同。因此,新记录 oldid 应该与从中复制内容的记录的 ID 匹配。我认为这很明显。
标签: sql sql-server-2005 join cursor