MERGE 可以激活多个 WHEN MATCHED AND 条件

问题描述 投票:0回答:1

可以在单个 SQL 合并中激活多个 WHEN MATCHED AND ... 条件吗?

     MERGE INTO translation t
        USING (
                SELECT d.iddiagram, rt.uuid_translation, rt.context, r.idrectangle, rt.x, rt.y, rt.z
                FROM json_to_recordset('${JSON.stringify(data.translation)}') AS rt(${column_list.translation})
                JOIN json_to_recordset('${JSON.stringify(data.rectangle)}') AS rr(${column_list.rectangle}) ON rt.idrectangle=rr.idrecta>
                JOIN rectangle r ON r.uuid_rectangle=rr.uuid_rectangle
                JOIN diagram d ON d.uuid_diagram='${uuid_diagram}'
        ) rt
        ON t.uuid_translation = rt.uuid_translation
        WHEN NOT MATCHED BY TARGET THEN
                INSERT (iddiagram, uuid_translation, context, idrectangle, x, y, z)
                VALUES(rt.iddiagram, rt.uuid_translation, rt.context, rt.idrectangle, rt.x, rt.y, rt.z)
        WHEN MATCHED AND t.context != rt.context THEN
                UPDATE SET context = rt.context
        WHEN MATCHED AND t.x != rt.x THEN
                UPDATE SET x = rt.x
        WHEN MATCHED AND t.y != rt.y THEN
                UPDATE SET y = rt.y
        WHEN MATCHED AND t.z != rt.z THEN
                UPDATE SET z = rt.z
        WHEN NOT MATCHED BY SOURCE
               AND EXISTS(SELECT * FROM diagram d WHERE d.iddiagram=t.iddiagram AND d.uuid_diagram='${uuid_diagram}')
                THEN DELETE

在上面的例子中,当同时 t.x != rt.x 和 t.y != rt.y 和 t.z != rt.z 时会发生什么?将执行多少个更新?

sql postgresql merge postgresql-17
1个回答
0
投票

可以在单个 SQL 合并中激活多个 WHEN MATCHED AND ... 条件吗?

不适用于一次单个传入行,不适用于由单独的

when matched
情况指定的多个条件。只有组合成一个
when matched
情况的多个条件才能“激活”给定行。不同的传入行可以匹配不同的情况。

在上面的例子中,当同时 t.x != rt.x 和 t.y != rt.y 和 t.z != rt.z 时会发生什么?将执行多少个更新?

正如已经指出的,除非您将它们设置为单一情况,否则仅适用第一个匹配,这意味着在

uuid_translation
上匹配的传入行只会导致
x
列的更新。

你所有的

matched
条件似乎都归结为一个

when matched then update 
set context=rt.context
   ,x=rt.x
   ,y=rt.y
   ,z=rt.z

如果您使用它,所有四列将立即更新。

有没有紧凑的 PostgreSQL 语法来编写

WHEN MATCHED AND ((t.x != rt.x) OR (t.y != rt.y) OR (t.z != rt.z)) THEN UPDATE SET x=rt.x, y=rt.y, z=rt.z
?幸运的是,不能有空值。

您可以使用元组语法

when matched and (t.x,t.y,t.z)!=(rt.x,rt.y,rt.z)
,但它在性能方面并不严格等效。

© www.soinside.com 2019 - 2024. All rights reserved.