PL/SQL - 从源表中的一行更新目标表中的多行
问题的出现原因是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语句即可更新目标表中的多行记录。
通过以上步骤,可以解决从源表中的一行更新目标表中的多行记录的问题。
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/)