我有一个每天加载新数据的表以及另一个包含该表更改历史记录的表。自上次加载数据以来,检查是否有任何数据发生了更改的最佳方法是什么?如何扫描两个查询之间的差异?
例如,我对表@a有一些适用于不同国家的策略,表@b跟踪对表@a所做的更改。如果现有散列不同于新散列,我可以使用校验和()来散列可以更改的字段,并将它们添加到表中。但是,MSDN认为这不是一个好主意,因为“冲突”可能发生,例如,两个不同的值映射到相同的校验和。
MSDN链接,校验 http://msdn.microsoft.com/en-us/library/aa258245(v=SQL.80).aspx
示例代码:
declare @a table
(
ownerid bigint
,Strategy varchar(50)
,country char(3)
)
insert into @a
select 1,'Long','USA'
insert into @a
select 2,'Short','CAN'
insert into @a
select 3,'Neutral','AUS'
declare @b table
(
Lastupdated datetime
,ownerid bigint
,Strategy varchar(50)
,country char(3)
)
insert into @b
(
Lastupdated
,ownerid
,strategy
,country
)
select
getdate()
,a.ownerid
,a.strategy
,a.country
from @a a left join @b b
on a.ownerid=b.ownerid
where
b.ownerid is null
select * from @b
--get a different timestamp
waitfor delay '00:00:00.1'
--change source data
update @a
set strategy='Short'
where ownerid=1
--add newly changed data into
insert into @b
select
getdate()
,a.ownerid
,a.strategy
,a.country
from
(select *,checksum(strategy,country) as hashval from @a) a
left join
(select *,checksum(strategy,country) as hashval from @b) b
on a.ownerid=b.ownerid
where
a.hashval<>b.hashval
select * from @b
你有没有在源数据的控制?你最好的选择是有一个日期时间字段来跟踪记录何时被创建和/或修改。然后只提取时间戳比您当前拥有的数据更新的数据。否则,您需要比较每行中的每个字段以查看是否有任何更改。 – MatBailie 2012-04-11 13:59:42
如果“导入”非常简单,那么经常会发现检查成本不仅仅是覆盖,因为您将新数据作为福音。 – 2012-04-11 14:00:38
请让我知道Table @b是否允许同一个ownerid的多条记录。是ownerid是主要关键。 – 2012-05-03 15:00:31