merge语句 - upsert - 在源表中执行唯一测试

时间:2015-04-02 14:32:32

标签: sql sql-server database merge upsert

我需要一些SQL Server合并声明的帮助。我使用的是2008版本。

我有两个表table1和table2,每个表中有3列:name,age,lastname。

我想从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.唯一意味着名称和姓氏应该相同。

感谢。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

如果只是插入,你就不会真的合并。仅插入就足够了。但这是一种方法来做到这一点

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