ORA-30926: 当 运行 合并查询时无法在源表中获得一组稳定的行
ORA-30926: unable to get a stable set of rows in the source tables when running Merge Query
我正在执行合并查询以更新 table 中的 2 列,但出现以下错误“ORA-30926:无法在源中获取 stable 行集 tables.
当我执行合并查询时,我已经在 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,
AA_PERSON_NATURAL_KEY,
AA_PERSON_ASSIGNMENT_KEY,
SCHEDULE_LINE_ID,
SRC_CREATED_DATE,
SRC_LAST_UPDATE_DATE
FROM
(
SELECT
PAY_RANGE_START_DATE_KEY,
AA_PERSON_NATURAL_KEY,
AA_PERSON_ASSIGNMENT_KEY,
SCHEDULE_LINE_ID,
SRC_CREATED_DATE,
SRC_LAST_UPDATE_DATE,
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
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;
I have already used a partition by and where rn=1 in the using clause to pick up only the non-duplicate records from source, but Oracle still throws the error.
你的
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,
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,
AA_PERSON_NATURAL_KEY,
AA_PERSON_ASSIGNMENT_KEY,
SCHEDULE_LINE_ID,
SRC_CREATED_DATE,
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.AA_PERSON_NATURAL_KEY,
BB.AA_PERSON_ASSIGNMENT_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
子句中不需要的行,因此您不需要 UPDATE SET
中的 WHERE
子句,并删除了 4 列的重复项用于匹配
我正在执行合并查询以更新 table 中的 2 列,但出现以下错误“ORA-30926:无法在源中获取 stable 行集 tables.
当我执行合并查询时,我已经在 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,
AA_PERSON_NATURAL_KEY,
AA_PERSON_ASSIGNMENT_KEY,
SCHEDULE_LINE_ID,
SRC_CREATED_DATE,
SRC_LAST_UPDATE_DATE
FROM
(
SELECT
PAY_RANGE_START_DATE_KEY,
AA_PERSON_NATURAL_KEY,
AA_PERSON_ASSIGNMENT_KEY,
SCHEDULE_LINE_ID,
SRC_CREATED_DATE,
SRC_LAST_UPDATE_DATE,
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
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;
I have already used a partition by and where rn=1 in the using clause to pick up only the non-duplicate records from source, but Oracle still throws the error.
你的
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,
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,
AA_PERSON_NATURAL_KEY,
AA_PERSON_ASSIGNMENT_KEY,
SCHEDULE_LINE_ID,
SRC_CREATED_DATE,
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.AA_PERSON_NATURAL_KEY,
BB.AA_PERSON_ASSIGNMENT_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
子句中不需要的行,因此您不需要 UPDATE SET
中的 WHERE
子句,并删除了 4 列的重复项用于匹配