2017-02-13 9 views
2

У меня есть 2 таблицы переменныхSQL Merge query - дубликаты?

  • Первая таблица имеет 1, 3, 5
  • Вторую таблицу имеет 2, 4, 5

Однако, когда я запускаю следующий запрос:

DECLARE @t1 TABLE (a int) 
DECLARE @t2 TABLE (b int) 

INSERT INTO @t1 (a) VALUES (1),(3),(5) 
INSERT INTO @t2 (b) VALUES (2),(4),(5) 

;WITH Source AS (
    SELECT * from @t1 
) 
MERGE INTO @t2 
USING Source ON 1 = 0 

WHEN NOT MATCHED THEN 
    INSERT (b) VALUES (a); 

SELECT * FROM @t2 

я неполносимметричный объединенные результаты:

Вместо того, чтобы 2, 4, 5, 1, 3, я получаю 2, 4, 5, 1, 3, 5

Вопрос

Почему я вижу двойную 5? Это запрос слияния, а 5 совпадает с другим 5 во второй таблице.

+1

'1 = 0'? Это всегда ложно. Вам также не нужен CTE, вы можете написать 'USING @ t2 как источник', например:' MERGE INTO @ t2, используя @ t1 в качестве источника на a = b ... ' –

ответ

5

Потому что ваше предложение on равно 1 = 0, ничего не найдено, поэтому все строки вставлены.

Изменение вашего on пункта до a = b даст ожидаемые результаты от 2,4,5,1,3.

rextester для on a = b: http://rextester.com/OPLL86727

Это может быть полезно, чтобы быть более явным с альясинга ваш источник и цель:

declare @t1 table (a int) 
declare @t2 table (b int) 
insert into @t1 (a) values (1),(3),(5) 
insert into @t2 (b) values (2),(4),(5) 

;with source as (
    select * from @t1 
) 
    merge into @t2 as target 
    using source 
    on source.a = target.b 
    when not matched then 
     insert (b) values (a); 

select * 
from @t2; 
2

Вы соответствие 1 = 0, который всегда будет срабатывать вставку. Вы должны использовать On Source.a = @ t2.b