【问题标题】:SQL Server Merge query - duplicates?SQL Server 合并查询 - 重复?
【发布时间】:2017-02-13 15:34:58
【问题描述】:

我有 2 个表变量

  • 第一个表有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 = 0?那总是假的。你也不需要CTE,你可以写USING @t2 as source,例如:MERGE INTO @t2 using @t1 as source on a=b ...

标签: sql-server merge


【解决方案1】:

因为您的 on 子句是 1 = 0 没有匹配项,所以插入了所有行。

on 子句更改为a = b 将产生2,4,5,1,3 的预期结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多