将非重复行插入一个表并在一个SQL语句中将行复制到另一个表中?

时间:2012-02-29 19:03:12

标签: sql-server sql-server-2008

假设我有一个表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语句来拆分原始数据集? (也许是mergeoutput的SQL Server 2008?)。 其中一个目的是减少表扫描,因为原始表可能非常大。


更新
唯一的方法是在dupdedup上创建分区视图,然后运行以下查询。

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 

创建分区视图有点麻烦。


更新
而不是触发器应该是最佳选择。

1 个答案:

答案 0 :(得分:2)

insert语句(通过MERGE或普通插入)只能影响一个表和一个表。为什么不能在事务中的两个语句中执行此操作?你经常这样做吗?如果它是一次性的,那么进行两次扫描而不是真的重要吗?如果它是多次,那么你可能有更好的索引,这样你只需要担心某一行,并减少优化器必须做的工作,以找到需要发送到dup / dedup表的新行。 / p>