我认为这是每个使用SQL Server的人最常见的情况。经典SQL Server操作
场景:
我有这些表tabSRC_A(id,date,data1)
,tabSRC_B(id,Date,data2)
和tabDEST
现在我的任务是从tableSRC_A
获取数据,适用tableSRC_B
对他们的一些筛选和清理,并将其插入到tabDEST
。
我做这个使用下面的代码
insert into tabDest(id, Date, Data1, Data2)
Select id, date, Data1, Data2
from tabSRC_A A
inner join tabSRC_B B on A.id = B.id and A.date = B.date
where not exists
(select * from tabDest Dest
where Dest.id = B.id and Dest.date = B.date)
和我更新,如果已经存在
这是该操作的最佳解决方案?
表的规模1000万行,每行
我也想用上面的方法
创建与代理键的视图和执行检查根据id,而不是检查每一行像这样的东西
insert into tabDest(id, Date, Data1, Data2)
Select id, date, Data1, Data2
from view_Created_From_TabA_TabB_adding_a_SurrogateKey_Kid SV
where SV.Kid > select (max(id) from tabDest)
我假设这会快得多。
请引导我与您有任何建议。
(我使用的是SQL Server 2000中,我知道它很老)
在这种情况下,左连接可能会更糟,因为您不会期望空id。 HTTP:// explainextended。com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ – JeffO 2011-04-01 20:40:57
@Jeff O.我当然承认它可能不会更好,我为什么我写下了“你有没有试过...”,但总有一种可能性,即Quassnoi的实验没有考虑过这个值得一试的变量。此外,id不是唯一加入的字段,因此可能为null。 – 2011-04-01 20:59:22