2017-02-13 16 views
2

私は2つのテーブル変数SQL Serverのマージクエリ - 重複しますか?

  • まずテーブルを持っているが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を得るための、私は二重の5を参照してくださいなぜ2, 4, 5, 1, 3, 5

質問

を取得しますか?これはマージクエリであり、5は2番目のテーブルの5にマッチします。

+1

「1 = 0」を使用する必要がありますか?それは常に偽です。あなたはCTEを必要としません。例えば、 'USING @ t2 as source 'と書くことができます。例えば、' MERGE INTO @ t2 @ t1をソースとして= b ... ' –

答えて

5

on句は1 = 0なので、一致しないのですべての行が挿入されます。

on句をa = bに変更すると、期待される結果は2,4,5,1,3になります。 on a = bため

rextester: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

関連する問題