TSQL:从 SELECT 结果插入或更新

use*_*810 2 t-sql sql-server

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

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
)
Run Code Online (Sandbox Code Playgroud)

我想出的一种解决方案是在运行上述查询之前删除 FinalTable 中的所有相关行。

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

if exists(...)
begin
  ... -- update
end
else
begin
  ... -- insert
end
Run Code Online (Sandbox Code Playgroud)

Vam*_*ala 6

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)
Run Code Online (Sandbox Code Playgroud)