假设我有一个表raw
,它有重复(通过PK)行,我想将非重复行插入表dedup
,将重复行插入dup
create table raw (A int, B char(5), C float, D money)
create table dedup(A int, B char(5), C float, D money primary key (A, B))
create table dup (A int, B char(5), C float, D money)
insert into raw values
(1, 'a', 2, 3), -- insert into dedup
(2, 'b', 3, 34),-- insert into dedup
(3, 'c', 3, 23),-- insert into dup
(3, 'c', 3, 13) -- insert into dup
是否可以只使用一个SQL语句来拆分原始数据集? (也许是merge
和output
的SQL Server 2008?)。 其中一个目的是减少表扫描,因为原始表可能非常大。
更新
唯一的方法是在dup
和dedup
上创建分区视图,然后运行以下查询。
insert into theView (a, b, c, d, isDup)
select r.*, case when d.a dup is null 0 else 1 end isDup
from raw r outer apply (
select a, b
from raw
where a = r.a and b = r.b
group by a, b
having count(*) > 1
) d
创建分区视图有点麻烦。
更新
而不是触发器应该是最佳选择。
答案 0 :(得分:2)
insert语句(通过MERGE或普通插入)只能影响一个表和一个表。为什么不能在事务中的两个语句中执行此操作?你经常这样做吗?如果它是一次性的,那么进行两次扫描而不是真的重要吗?如果它是多次,那么你可能有更好的索引,这样你只需要担心某一行,并减少优化器必须做的工作,以找到需要发送到dup / dedup表的新行。 / p>