合并语句 - 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 将是如果您更新已存在的记录。
我需要一些关于 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 将是如果您更新已存在的记录。