Window 在 Oracle 的更新语句中运行 SQL

Window functions in an update statement in Oracle SQL

我正在使用 Oracle SQL DB 19c。 尝试了以下 Oracle SQL 脚本,但其中 none 可以使用 window 表达式向我的 table 添加一列。

第一个脚本运行到错误消息:“SQL 命令未正确结束”:

UPDATE TRANSACTION_HISTORY SET TRANSACTION_HISTORY.ID = X.RN
    FROM
    (SELECT SEQUENCE,
    ROW_NUMBER() OVER (PARTITION BY TRANSACTION_DATE, TRANSACTION_PARTNER ORDER BY TRANSACTION_DATE, TRANSACTION_PARTNER ASC) AS RN
    FROM TRANSACTION_HISTORY
    ) AS X
    WHERE TRANSACTION_HISTORY.SEQUENCE = X.SEQUENCE

第二个运行到错误消息:“缺少 ON 关键字”但 ON 存在:

merge into TH USING
    (SELECT TRANSACTION_DATE, TRANSACTION_PARTNER, SEQUENCE,
    ROW_NUMBER() OVER (PARTITION BY TRANSACTION_DATE, TRANSACTION_PARTNER ORDER BY TRANSACTION_DATE, TRANSACTION_PARTNER ASC) AS RN
    FROM TRANSACTION_HISTORY TH
    ) X
ON X.SEQUENCE = TH.SEQUENCE
WHEN MATCHED THEN UPDATE 
SET TH.ID = X.RN

有人可以帮忙吗?

您需要在 ON 后加上括号,如下所示:

merge into TH USING
    (SELECT SEQUENCE, 
            ROW_NUMBER() OVER (PARTITION BY TRANSACTION_DATE, TRANSACTION_PARTNER 
                              ORDER BY TRANSACTION_DATE, TRANSACTION_PARTNER ASC) AS RN
    FROM TRANSACTION_HISTORY TH
    ) X
ON (X.SEQUENCE = TH.SEQUENCE) -- you need to use parenthesis
WHEN MATCHED THEN UPDATE 
SET TH.ID = X.RN