Предположим, у меня есть таблица 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
Немного обременительно создавать представление раздела.
Обновление:
Вместо триггера должен быть путь.