合并语句 - upsert - 在源 table 中执行唯一测试

merge statement - upsert - performing unique test in source table as well

我需要一些关于 SQL 服务器合并语句的帮助。我使用的是 2008 版。

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

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

我知道以下会起作用 -

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)

基本上我只想插入 'unique records' 从 table 2 到 table 1。唯一意味着名字和姓氏应该相同。

谢谢。

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

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
);

它不是真正的 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 将是如果您更新已存在的记录。