【问题标题】:merge statement - upsert - performing unique test in source table as well合并语句 - upsert - 也在源表中执行唯一测试
【发布时间】:2015-06-07 13:28:58
【问题描述】:

我需要一些有关 SQL Server 合并语句的帮助。我使用的是 2008 版。

我有两个表 table1 和 table2,每个表中有 3 列:姓名、年龄、姓氏。

我想做从 table2 到 table1 的 Upsert 的小变种。如果表 1 中存在记录,则忽略。如果不存在则插入。

我知道以下会起作用 -

merge into [test].[dbo].[table1] a
using [test].[dbo].[table2] b
on a.name = b.name and a.lastname = b.lastname
when not matched then
insert (name, age, lastname) values (b.name, b.age, b.lastname)

我想知道我是否可以做这样的事情?目前以下不起作用:

merge into [test].[dbo].[table1] a
using [test].[dbo].[table2] b
on a.name = b.name and a.lastname = b.lastname
when not matched then
insert (select name, max(age), lastname from b group by name, lastname)

基本上我只想将表 2 中的“唯一记录”插入表 1。唯一意味着姓名和姓氏应该相同。

谢谢。

【问题讨论】:

    标签: sql sql-server database merge upsert


    【解决方案1】:

    它不是真正的 UPSERT 操作,它是一个简单的插入,我会做这样的事情......

    insert into [test].[dbo].[table1](name, age, lastname)
    SELECT b.name, MAX(b.age) Age, b.lastname
    FROM [test].[dbo].[table2] b
    WHERE NOT EXISTS (SELECT 1
                      FROM [test].[dbo].[table1]
                      WHERE name = b.name 
                       and lastname = b.lastname)
    GROUP BY b.name, b.lastname
    

    如果您更新记录(如果它们已经存在),则为 UPSERT。

    【讨论】:

      【解决方案2】:

      仅仅插入你并没有真正合并。仅插入一个就足够了。但这是一种方法

      merge into [test].[dbo].[table1] a
      using (
          select  
              name,
              lastname,
              max(age) age
          from [test].[dbo].[table2] 
          group by
              name,
              lastname
      ) b on 
          a.name = b.name and 
          a.lastname = b.lastname
      when not matched 
      then
      insert (
          name,
          lastname,
          age
      ) 
      VALUES (
          b.name,
          b.lastname,
          b.age
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        • 1970-01-01
        • 2013-11-23
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多