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;
我们有一个数据库,其中合并了许多记录。一个人拥有多个合并 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;