pl sql中如何使用基于select语句的WHERE循环【connect by prior相关解决】

How to use WHERE loop based on select statment in plsql [solution related to connect by prior]

我们有一个数据库,其中合并了许多记录。一个人拥有多个合并 ID 并不罕见。我想创建一个 table 来跟踪每个人的第一个 ID 和他们最近的 ID。我假设这是执行此操作的最佳方法,但我不确定如何编写 WHILE 循环。

原 table 看起来像这样:

Table1  
old_id  new_id  
001     001  
002     002  
001     003  
004     004  
003     005  
005     006  

首先,我运行

CREATE Table2 AS  
SELECT *  
FROM Table1   
WHERE old_id = new_id  
; 

在运行之后,我应该

Table2  
old_id  new_id  
001     001  
002     002  
004     004    

然后我要循环直到没有更多更新要做的语句是:

UPDATE Table2  
SET new_id = (SELECT b.new_id  
              FROM Table1 AS a  
                JOIN Table1 AS b ON b.old_id = a.new_id  
              WHERE b.old_id != b.new_id)  
;

直到我得到我正在尝试构建的结果 table:

Table2  
old_id  new_id  
001     006  
002     002  
004     004 

在此先感谢您的帮助。

Oracle 安装程序

CREATE TABLE Table1 ( old_id, new_id ) AS
SELECT '001', '001' FROM DUAL UNION ALL
SELECT '002', '002' FROM DUAL UNION ALL  
SELECT '001', '003' FROM DUAL UNION ALL
SELECT '004', '004' FROM DUAL UNION ALL
SELECT '003', '005' FROM DUAL UNION ALL
SELECT '005', '006' FROM DUAL;

CREATE TABLE Table2 ( old_id, new_id ) AS
SELECT CONNECT_BY_ROOT( old_id ),
       new_id
FROM   table1
WHERE  CONNECT_BY_ISLEAF = 1
START WITH old_id = new_id
CONNECT BY NOCYCLE PRIOR new_id = old_id;

查询

SELECT * FROM TABLE2;

输出:

OLD_ID NEW_ID
------ ------
001    006    
002    002    
004    004  

作为视图:

根据@xQbert 的建议,您可以将其创建为视图而不是 table,这样它会保持最新。

CREATE VIEW View_Of_Table1( old_id, new_id ) AS
SELECT CONNECT_BY_ROOT( old_id ),
       new_id
FROM   table1
WHERE  CONNECT_BY_ISLEAF = 1
START WITH old_id = new_id
CONNECT BY NOCYCLE PRIOR new_id = old_id;