我需要执行如下所示的查询。列 KEY1 和 KEY2 是不能重复的键。如果有匹配的键,我需要执行更新 VAL 而不是插入。如何在 Sql Server 中执行此操作?
INSERT INTO tableA
(
KEY1,
KEY2,
VAL,
) VALUES (
-- Row A
'datakeyA1',
'datakeyA2',
'somevaluetoinsertorupdate'
) , (
-- Row B
'datakeyB1',
'datakeyB2',
'somevaluetoinsertorupdate'
) , (
-- Row C
'datakeyC1',
'datakeyC2',
'somevaluetoinsertorupdate'
);
我尝试使用 MERGE,但查看语法,我不确定它是否支持更新/插入多行。如果过去有人遇到过类似的情况,你能帮忙吗?
编辑:
如果我使用 MySql,我会只使用:
ON DUPLICATE KEY UPDATE
VAL = VALUES(VAL)
在查询中。
您可以使用表值构造函数作为源表来使其适用于MERGE
:
MERGE tableA AS t
USING (VALUES
('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate'),
('datakeyB1', 'datakeyB2', 'somevaluetoinsertorupdate'),
('datakeyC1', 'datakeyC2', 'somevaluetoinsertorupdate')
) AS s (Key1, Key2, Val)
ON s.Key1 = t.Key1
AND s.Key2 = t.Key2
WHEN MATCHED THEN
UPDATE
SET Val = s.Val
WHEN NOT MATCHED THEN
INSERT (Key1, Key2, Val)
VALUES (s.Key1, s.Key2, s.Val);
尝试像这样使用 MERGE
:SQL 小提琴
MS SQL Server 2008 架构设置:
CREATE TABLE tableA
(
KEY1 VARCHAR(50),
KEY2 VARCHAR(50),
VAL VARCHAR(50)
PRIMARY KEY (Key1, Key2)
)
INSERT INTO tableA
VALUES ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate')
查询 1:
MERGE tableA AS T
USING
(VALUES ('datakeyA1','datakeyA2','SOME NEW VALUE'),
('datakeyB1','datakeyB2','somevaluetoinsertorupdate'),
('datakeyC1','datakeyC2','somevaluetoinsertorupdate')) AS S(Key1, Key2, Val)
ON (S.Key1 = T.Key1 AND S.Key2 = T.Key2)
WHEN MATCHED
THEN UPDATE SET T.Val = S.Val
WHEN NOT MATCHED BY TARGET
THEN INSERT (Key1, Key2, VAL) VALUES (S.Key1, S.Key2, S.Val);
SELECT *
FROM tableA
结果:
| KEY1 | KEY2 | VAL |
|-----------|-----------|---------------------------|
| datakeyA1 | datakeyA2 | SOME NEW VALUE |
| datakeyB1 | datakeyB2 | somevaluetoinsertorupdate |
| datakeyC1 | datakeyC2 | somevaluetoinsertorupdate |