PL/SQL - 从源表中的一行更新目标表中的多行

18 浏览
0 Comments

PL/SQL - 从源表中的一行更新目标表中的多行

我正在使用合并语句将两个表进行合并,其中源表的一行可能会更新目标表中的多行。\n大致的代码如下:\n

MERGE TABLE1 A
USING (SELECT EMP_CODE, DAYS_OFF FROM TABLE2) B
ON (A.ID = B.EMP_CODE)
WHEN MATCHED THEN
UPDATE SET A.DAYS_OFF = B.DAYS_OFF;

\n然而,当我尝试这样做时,我得到了SQL错误:ORA-30926:无法从源表中获取稳定的行集。\n我还有其他方法可以实现吗?

0
0 Comments

问题的出现原因是Oracle无法为源表中的每个记录获取一个只与该记录匹配的记录集合(例如,导致多对多关系的记录集合)。解决方法是在目标表中检查具有相同“ID”的重复项。

解决方法是使用MERGE语句将目标表和源表进行合并,并根据ID进行匹配。当匹配到记录时,使用UPDATE语句将目标表中的DAYS_OFF字段更新为源表中的DAYS_OFF字段的值。

示例代码如下:

MERGE INTO TABLE1 A

USING (SELECT * FROM TABLE2) B

ON (A.ID = B.EMP_CODE)

WHEN MATCHED THEN

UPDATE SET A.DAYS_OFF = B.DAYS_OFF;

但是,在执行MERGE语句时可能会出现ORA-30926错误,提示无法在源表中获取稳定的记录集合。为了解决这个问题,可以执行一些额外的步骤。

首先,可以使用以下语句检查目标表中具有相同ID的重复项:

SELECT ID, COUNT(0) FROM TABLE1 GROUP BY ID;

然后,可以使用以下语句删除目标表中的重复项,只保留每个ID的最后一条记录:

DELETE FROM TABLE1 T1 WHERE T1.ROWID NOT IN (SELECT MAX(ROWID) FROM TABLE1 T2 WHERE T2.ID = T1.ID);

最后,再次执行MERGE语句即可更新目标表中的多行记录。

通过以上步骤,可以解决从源表中的一行更新目标表中的多行记录的问题。

0
0 Comments

PL/SQL - Update multiple rows in the target table from one row in the source table

当我们尝试从源表中的一行更新目标表中的多行时,可能会遇到以下错误信息:

SQL Error: ORA-30926: unable to get a stable set of rows in the source tables

这个错误的原因是源表中可能包含重复的值。为了解决这个问题,我们需要为每一行添加一个额外的列来唯一标识。

我们可以创建一个名为source_table的源表,并向其中插入一些数据。然后创建一个名为target_table的目标表,并向其中插入一些数据。然后,我们可以使用MERGE语句将这两个表合并起来。

合并表的代码如下:

MERGE INTO target_table trg

USING (

SELECT col1, col2, col3

FROM source_table

) src

ON (trg.col1 = src.col1)

WHEN MATCHED THEN UPDATE SET

trg.col2 = src.col2,

trg.col3 = src.col3

WHEN NOT MATCHED THEN INSERT

(

col1,

col2,

col3

)

VALUES

(

src.col1,

src.col2,

src.col3

);

COMMIT;

这段代码首先从源表中选择col1、col2和col3列的值,然后使用MERGE语句将源表和目标表进行合并。当源表和目标表中的col1列的值相等时,使用UPDATE语句更新目标表中的col2和col3列的值。如果源表和目标表中的col1列的值不相等,则使用INSERT语句将源表中的行插入到目标表中。

这样,我们就成功地从源表中的一行更新了目标表中的多行。

更多信息请查看:[链接](https://aykutakin.wordpress.com/2013/01/29/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables/)

0