Вставить недублированные строки в одну таблицу, а дублированные строки в другую таблицу в одном операторе SQL? - PullRequest
0 голосов
/ 29 февраля 2012

Предположим, у меня есть таблица 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 

Немного обременительно создавать представление раздела.


Обновление:
Вместо триггера должен быть путь.

1 Ответ

2 голосов
/ 29 февраля 2012

Оператор вставки (через MERGE или обычную вставку) может влиять только на одну таблицу и одну таблицу.Почему вы не можете сделать это в двух утверждениях в транзакции?Как часто ты это делаешь?Если это один раз, действительно ли два скана против одного действительно имеют значение?Если это несколько раз, тогда вы, вероятно, сможете лучше индексировать, чтобы вы беспокоились только об определенной строке и сократили работу, которую оптимизатор должен выполнить, чтобы найти новые строки, которые нужно отправить в таблицы dup / dedup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...