2015-04-02 47 views
0

我需要一些帮助与SQL Server合并语句。我正在使用版本2008.merge语句 - upsert - 在源表中执行独特的测试以及

我有两个表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.独特的手段名字和姓氏应该是相同的。

谢谢。

回答

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是,如果你更新的记录如果它们已经存在。

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