TSQL:SELECT结果的INSERT或UPDATE

时间:2017-02-07 19:45:02

标签: sql-server tsql

我有以下查询,我从表中获取一些数据,并使用结果插入名为finalTable的表中。 finalTable.col1是一个pk。但是,在运行以下查询之前,finalTable中的某些行已经存在并具有相同的pk。我想更改它以便插入(如果在finalTable中不存在pk)或更新(如果pk已存在于finalTable中)。

INSERT INTO finalTable (col1, col2, col3, col4, col5) 
(
SELECT o.id, 14, 0, 1, 4
FROM Table1 c
INNER JOIN Table2 m ON c.ID = m.ID 
INNER JOIN Table3 o ON m.ID = o.ID 
WHERE c.ID = 40
)

我提出的一个解决方案是在运行上述查询之前删除finalTable中的任何相关行。

我想出的另一个解决方案是使用“if exists”。我会将select查询放在if exists语句,if的子句和else的子句中。我不喜欢这个解决方案,因为我必须将选择查询放在3个地方,而不是仅仅放在一个地方。

if exists(...)
begin
  ... -- update
end
else
begin
  ... -- insert
end

1 个答案:

答案 0 :(得分:3)

您可以对此类案件使用MERGE声明。

MERGE finaltable as target
USING (SELECT o.id
       FROM Table1 c
       INNER JOIN Table2 m ON c.ID = m.ID 
       INNER JOIN Table3 o ON m.ID = o.ID 
       WHERE c.ID = 40) as source
ON target.col1=source.id
WHEN MATCHED THEN 
UPDATE SET col2=14,col3=0,col4=1,col5=4
WHEN NOT MATCHED THEN 
INSERT (col1, col2, col3, col4, col5)
VALUES (source.id,14, 0, 1, 4)