我有以下查询,我从表中获取一些数据,并使用结果插入名为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
答案 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)