如何使用 MERGE 语句更新多条记录并根据同一语句中先前更新的记录使用 max(column_value)?

How do i update multiple records using MERGE statement and use max(column_value) based on previously updated records in the same statement?

我需要使用 Oracle MERGE 语句来更新 table 的记录。我想更新的列之一应该来自 table 的现有记录和作为当前 MERGE 语句的一部分更新的记录的 MAX 值。我该怎么做?

更新时,我尝试将 max(column value) 作为内部查询,但它没有考虑将更新的记录作为 MERGE 的一部分。

下面是示例 table。

出现次数表示我们拥有的父子组合的数量。

TABLE 名称:结构

PARENT     CHILD    OCCURRENCE
A          M        1
A          M        2
A          F        1
B          M        1

请注意,我只提到了这个 table 的几个栏目和记录来解释要求。我想将父 'A' 更新为 'B'。在更新这三个记录时,我必须相应地更新事件。下面是我试过的 MERGE 语句。

MERGE INTO STRUCTURE a
USING (                                            
      select 'A' as old_parent,
             'B' as new_parent,
             child as child from STRUCTURE
  ) b ON (a.parent = b.old_parent)                                              
  WHEN MATCHED THEN
      UPDATE SET parent = b.new_parent,
                 occurrence = (SELECT NVL(MAX(occurrence)) + 1 
                                  FROM structure
                                  WHERE parent = b.new_parent and
                                  child = b.child)

因为我把max(occurrence)写成内部查询,以为每条记录每次都会执行一次,所以occurrence会随着每条更新记录递增,但是并没有发生。

下面是预期的结果

PARENT     CHILD    OCCURRENCE
B          M        2
B          M        3
B          F        1
B          M        1

我得到的实际结果


PARENT     CHILD    OCCURRENCE
B          M        2
B          M        2
B          F        1
B          M        1

任何关于如何在单个 MERGE 语句中实现此目的的帮助/指导将不胜感激。如果不可能,是否有任何其他方法可以使用 sQL 中的单个语句完成此操作?谢谢。

编辑 3: 我成功收到了你的愿望输出,但我不明白你为什么需要这样的结果。请更改 from 子句并将其放入您的合并中:

SELECT parent old_parent,
       'B'    AS new_parent,
       child  AS child,
       occurence,
         MAX (occurence) OVER (PARTITION BY parent, CHILD ORDER BY 1)
       + COUNT (*) OVER (PARTITION BY parent, child ORDER BY 1)
       - OCCURENCE
           NEW_OCCURENCE
  FROM (SELECT 'a' parent, 'm' child, 1 occurence FROM DUAL
        UNION ALL
        SELECT 'a' parent, 'm' child, 2 occurence FROM DUAL
        UNION ALL
        SELECT 'a' parent, 'f' child, 1 occurence FROM DUAL
        UNION ALL
        SELECT 'b' parent, 'm' child, 1 occurence FROM DUAL) STRUCTURE

我认为您可以使用 Max 作为分析函数。请参阅下面的合并:

MERGE INTO STRUCTURE a
     USING (SELECT old_parent,
                   'B'   AS new_parent,
                   child AS child,
                   MAX (occurrence) OVER (PARTITION BY old_parent, CHILD ORDER BY 1) + 1
                       NEW_OCCURENCE
              FROM STRUCTURE) b
        ON (a.parent = b.old_parent)
WHEN MATCHED
THEN
    UPDATE SET parent = b.new_parent, occurrence = b.NEW_OCCURENCE;