如何在单个合并语句中执行多个更新
Posted
技术标签:
【中文标题】如何在单个合并语句中执行多个更新【英文标题】:How to perform multiple updates in single merge statement 【发布时间】:2019-10-16 00:11:20 【问题描述】:我需要使用两个不同的条件更新单个合并语句中的多个列,例如 1. row_ind = N;更新一些列 2. row_ind = Y;更新一些列
我将如何在 sqlserver/oracle 中实现这一目标
WHEN MATCHED THEN
UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
TARGET.LinkId = SOURCE.Id where row_ind ='Y'
UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
TARGET.LinkId = SOURCE.Id where row_ind = 'N';
【问题讨论】:
您实际使用的是哪个数据库系统?对于 SqlServer,您可以查看表变量并通过连接进行更新 有什么理由不能把逻辑放在源子查询中?这将使更新部分更清晰。它肯定可以在 Oracle 中工作,并且可能也可以在 SQL Server 中工作。 【参考方案1】:您可以使用“CASE..WHEN”在Oracle中实现如下:
WHEN MATCHED THEN UPDATE SET TARGET.NODEID = CASE ROW_IND
WHEN 'Y' THEN SOURCE.STARTNODEID
WHEN 'N' THEN SOURCE.ENDNODEID
END,
TARGET.LINKID = SOURCE.ID;
谢谢
【讨论】:
【参考方案2】:对于tsql,您可以尝试使用AND <clause_search_condition>
MERGE
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
USING <table_source>
ON <merge_search_condition>
[ WHEN MATCHED [ AND <clause_search_condition> ] <==
THEN <merge_matched> ] [ ...n ]
<merge_matched>::=
UPDATE SET <set_clause> | DELETE
因为您可以在 AND 之后有多个 WHEN MATCHED 和不同的附加条件,您可以使用单个合并语句创建多个更新。
WHEN MATCHED AND row_ind ='Y' THEN
UPDATE SET TARGET.NodeId = SOURCE.StartNodeId,
TARGET.LinkId = SOURCE.Id
WHEN MATCHED AND row_ind ='N' THEN
UPDATE SET TARGET.NodeId = SOURCE.EndNodeId,
TARGET.LinkId = SOURCE.Id ;
在oracle 你不能这样做,因为只允许一个merge_update_clause
mysql 不支持 MERGE
【讨论】:
以上是关于如何在单个合并语句中执行多个更新的主要内容,如果未能解决你的问题,请参考以下文章