ORA-30926: 运行合并查询时无法在源表中获得一组稳定的行

问题描述

enter image description here

我正在执行合并查询以更新表中的 2 列,但出现以下错误“ORA-30926:无法在源表中获得一组稳定的行。

当我执行合并查询但我已经在 using 子句中使用了分区 by 和 where rn=1 来仅从源中获取非重复记录,但 Oracle 仍然抛出错误

我该怎么做才能解决这个问题?

MERGE
/*+ parallel(A) enable_parallel_dml*/
INTO
(
  SELECT
    PAY_RANGE_START_DATE_KEY,AA_PERSON_NATURAL_KEY,AA_PERSON_ASSIGNMENT_KEY,SCHEDULE_LINE_ID,SRC_CREATED_DATE,SRC_LAST_UPDATE_DATE
  FROM
    EDWFIN.PSP_LABOR_SCHD_DAY_F_ROLLUP
)
A USING
(
SELECT
  PAY_RANGE_START_DATE_KEY,SRC_LAST_UPDATE_DATE
FROM
  (
    SELECT
      PAY_RANGE_START_DATE_KEY,SRC_LAST_UPDATE_DATE,ROW_NUMBER() OVER ( PARTITION BY PAY_RANGE_START_DATE_KEY,SRC_LAST_UPDATE_DATE ORDER BY ROWNUM ) AS rn
    FROM
      EDWFIN.PSP_LABOR_SCHD_DAY_F_ROLLUP_FRS_356
  )
WHERE
  rn = 1
)
B ON
(
  A.PAY_RANGE_START_DATE_KEY = B.PAY_RANGE_START_DATE_KEY AND
  A.AA_PERSON_NATURAL_KEY    = B.AA_PERSON_NATURAL_KEY AND
  A.AA_PERSON_ASSIGNMENT_KEY = B.AA_PERSON_ASSIGNMENT_KEY AND
  A.SCHEDULE_LINE_ID         = B.SCHEDULE_LINE_ID
)
WHEN MATCHED THEN
  UPDATE
  SET
    A.SRC_CREATED_DATE     = B.SRC_CREATED_DATE,A.SRC_LAST_UPDATE_DATE = B.SRC_LAST_UPDATE_DATE
  WHERE
    A.SRC_CREATED_DATE      <> B.SRC_CREATED_DATE
  OR A.SRC_LAST_UPDATE_DATE <> B.SRC_LAST_UPDATE_DATE;
   COMMIT;

解决方法

我已经在 using 子句中使用了分区 by 和 where rn=1 来仅从源中提取非重复记录,但 Oracle 仍然抛出错误。

你的

ROW_NUMBER() OVER ( PARTITION BY PAY_RANGE_START_DATE_KEY,AA_PERSON_NATURAL_KEY,AA_PERSON_ASSIGNMENT_KEY,SCHEDULE_LINE_ID,SRC_CREATED_DATE,SRC_LAST_UPDATE_DATE ORDER BY ROWNUM ) AS rn

带有过滤器 rn=1 当您在 ON() 子句中使用 4 列时,删除 6 列的重复项。 此外,您正在使用另一个过滤器来过滤要更新的行。

获得所需内容的最简单方法是在 USING 子句中过滤所需数据:

MERGE
/*+ parallel(A) enable_parallel_dml*/
INTO
(
  SELECT
    PAY_RANGE_START_DATE_KEY,SRC_LAST_UPDATE_DATE
  FROM
    EDWFIN.PSP_LABOR_SCHD_DAY_F_ROLLUP
)
A USING
(
SELECT
  PAY_RANGE_START_DATE_KEY,SRC_LAST_UPDATE_DATE
FROM
  (
    SELECT
      BB.PAY_RANGE_START_DATE_KEY,BB.AA_PERSON_NATURAL_KEY,BB.AA_PERSON_ASSIGNMENT_KEY,BB.SCHEDULE_LINE_ID,BB.SRC_CREATED_DATE,BB.SRC_LAST_UPDATE_DATE,ROW_NUMBER() OVER ( 
         PARTITION BY BB.PAY_RANGE_START_DATE_KEY,BB.SCHEDULE_LINE_ID
         ORDER BY ROWNUM /*?*/ 
         ) AS rn
    FROM
      EDWFIN.PSP_LABOR_SCHD_DAY_F_ROLLUP_FRS_356 BB,EDWFIN.PSP_LABOR_SCHD_DAY_F_ROLLUP AA
    WHERE
      AA.PAY_RANGE_START_DATE_KEY = BB.PAY_RANGE_START_DATE_KEY AND
      AA.AA_PERSON_NATURAL_KEY    = BB.AA_PERSON_NATURAL_KEY AND
      AA.AA_PERSON_ASSIGNMENT_KEY = BB.AA_PERSON_ASSIGNMENT_KEY AND
      AA.SCHEDULE_LINE_ID         = BB.SCHEDULE_LINE_ID
      AND (
          AA.SRC_CREATED_DATE     <> BB.SRC_CREATED_DATE
       OR AA.SRC_LAST_UPDATE_DATE <> BB.SRC_LAST_UPDATE_DATE
      )
  )
WHERE
  rn = 1
)
B ON
(
  A.PAY_RANGE_START_DATE_KEY = B.PAY_RANGE_START_DATE_KEY AND
  A.AA_PERSON_NATURAL_KEY    = B.AA_PERSON_NATURAL_KEY AND
  A.AA_PERSON_ASSIGNMENT_KEY = B.AA_PERSON_ASSIGNMENT_KEY AND
  A.SCHEDULE_LINE_ID         = B.SCHEDULE_LINE_ID
)
WHEN MATCHED THEN
  UPDATE
  SET
    A.SRC_CREATED_DATE     = B.SRC_CREATED_DATE,A.SRC_LAST_UPDATE_DATE = B.SRC_LAST_UPDATE_DATE;

如您所见,我过滤了 USING 子句中不需要的行,因此您不需要 WHERE 中的 UPDATE SET 子句,并删除了用于匹配