我有一個如下所示的表格
| ID | 以前的_id | 最新的_id |
|---|---|---|
| 1 | 空值 | 空值 |
| 2 | 1 | 空值 |
| 3 | 2 | 空值 |
| 4 | 空值 | 空值 |
| 5 | 4 | 空值 |
| 6 | 6 | 空值 |
我想通過將 latest_id 列值設定為最低層次值來更新表,如下所示:
| ID | 以前的_id | 最新的_id |
|---|---|---|
| 1 | 空值 | 3 |
| 2 | 1 | 3 |
| 3 | 2 | 3 |
| 4 | 空值 | 6 |
| 5 | 4 | 6 |
| 6 | 5 | 6 |
我曾嘗試使用 connect by,但查詢變得太復雜,因為無法分配靜態值,此更新適用于整個表。
下面是我可以根據它的 id 為單個記錄撰寫的內容,我如何將它概括為表中的所有記錄?
UPDATE TABLENAME1
SET LATEST_ID = (SELECT MAX(ID)
FROM TABLENAME1
START WITH ID = 3
CONNECT BY PREVIOUS_ID = PRIOR ID );
uj5u.com熱心網友回復:
您可以使用相關的分層查詢和過濾器來獲取葉行:
UPDATE table_name t
SET latest_id = (SELECT id
FROM table_name h
WHERE CONNECT_BY_ISLEAF = 1
START WITH h.id = t.id
CONNECT BY previous_id = PRIOR id);
其中,對于樣本資料:
CREATE TABLE table_name (id, previous_id, latest_id) AS
SELECT 1, null, CAST(null AS NUMBER) FROM DUAL UNION ALL
SELECT 2, 1, null FROM DUAL UNION ALL
SELECT 3, 2, null FROM DUAL UNION ALL
SELECT 4, null, null FROM DUAL UNION ALL
SELECT 5, 4, null FROM DUAL UNION ALL
SELECT 6, 5, null FROM DUAL;
將表更新為:
ID PREVIOUS_ID LATEST_ID 1 空值 3 2 1 3 3 2 3 4 空值 6 5 4 6 6 5 6
db<>在這里擺弄
uj5u.com熱心網友回復:
對于已接受的答案,我將添加此替代方法,通過消除相關子查詢,它可能對大型資料集表現更好。
MERGE INTO table_name t
USING (
SELECT CONNECT_BY_ROOT(id) root_id, id latest_id
FROM table_name
WHERE connect_by_isleaf = 1
CONNECT BY previous_id = prior id ) u
ON ( t.id = u.root_id )
WHEN MATCHED THEN UPDATE SET t.latest_id = u.latest_id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472531.html
