我有以下表格:
DataValue@H_502_3@
DateStamp ItemId Value ---------- ------ ----- 2012-05-22 1 6541 2012-05-22 2 12321 2012-05-21 3 32
tmp_holding_DataValue@H_502_3@
DateStamp ItemId Value ---------- ------ ----- 2012-05-22 1 6541 2012-05-22 4 87 2012-05-21 5 234
DateStamp和ItemId是主键列。@H_502_3@
我正在做一个插入,全天候定期运行(在存储过程中):@H_502_3@
insert into DataValue(DateStamp,ItemId,Value) select DateStamp,Value from tmp_holding_DataValue;
这将数据从保持表(tmp_holding_DataValue)移动到主数据表(DataValue)中。夹持表然后被截断。@H_502_3@
问题是,如在示例中,保持表可以包含主表中已经存在的项。由于密钥不允许重复值,因此过程将失败。@H_502_3@
一个选项是在insert proc上放置一个where子句,但主数据表有1000万行,这可能需要很长时间。@H_502_3@
解决方法
INSERT dbo.DataValue(DateStamp,Value) SELECT DateStamp,Value FROM dbo.tmp_holding_DataValue AS t WHERE NOT EXISTS (SELECT 1 FROM dbo.DataValue AS d WHERE DateStamp = t.DateStamp AND ItemId = t.ItemId);