【发布时间】:2014-02-05 15:29:55
【问题描述】:
这是我的查询:
MERGE INTO [payments_orders] o USING (
SELECT 1 AS [order_id], 50.00 AS [amount] UNION ALL
SELECT 2 AS [order_id], 50.00 AS [amount]
) AS t ([order_id], [amount])
ON o.[payment_id] = 4 AND o.[order_id] = t.[order_id]
WHEN MATCHED THEN UPDATE SET o.[amount] = t.[amount]
WHEN NOT MATCHED THEN INSERT ([payment_id], [order_id], [amount])
VALUES (4, t.[order_id], t.[amount])
WHEN NOT MATCHED BY SOURCE AND o.[payment_id] = 4 THEN DELETE
OUTPUT $ACTION AS [action], [deleted].[order_id];
我正在运行 MERGE 语句来插入或更新哪些订单记录与哪些付款记录相关联以及该付款的分配方式。
我想做的是在末尾添加WHERE $ACTION = 'DELETE';然而那是行不通的。显然你不能在OUTPUT 子句中使用WHERE 子句;那是“不正确的语法”。
如何使该语句输出的唯一行是由DELETE 触发的行?
【问题讨论】:
-
将它们作为单独的语句保存可能会更好。无论如何,您当前的代码并不能保护您免受并发/竞争条件的影响。 Please read this.
-
@AaronBertrand,谢谢你。我从来没有读过它(反正从来没有使用过 MERGE)
标签: sql sql-server merge