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



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

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

我想把Upsert从表2变成表1。如果表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中。Unique表示名称和姓氏应该相同。

谢谢。

这不是一个真正的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将是有效的

对于插入,您并没有真正合并。仅插入一个就足够了。但有一种方法可以做到

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

最新更新