跳至內容
Astera Technology

遞迴可達報表為何重複同一下游節點?

結果要可達使用者集合時,排隊只收不同節點記錄。

下載完整個案資料及參考答案 ↓

準備報表輸入

本例 A 可達的每節點只列一次,不列 A 自己。菱形圖由 B、C 都到 D。遞迴 UNION ALL 把兩條路都排入;只含 node 的 UNION 行才抑重複節點。

以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。

假設輸入:edges
起點target
AB
AC
BD
CD
下載可編輯 CSV ↓
完整建表及插入假設資料
CREATE TABLE edges(source TEXT NOT NULL,target TEXT NOT NULL,PRIMARY KEY(source,target)); INSERT INTO edges VALUES('A','B'),('A','C'),('B','D'),('C','D');

比較錯誤及更正結果

錯誤 SELECT:重現問題
WITH RECURSIVE reached(node) AS (VALUES('A') UNION ALL SELECT e.target FROM edges e JOIN reached r ON e.source=r.node) SELECT node FROM reached WHERE node<>'A' ORDER BY node;
錯誤查詢的逐行結果
節點
B
C
D
D
下載可編輯 CSV ↓
更正 SELECT
WITH RECURSIVE reached(node) AS (VALUES('A') UNION SELECT e.target FROM edges e JOIN reached r ON e.source=r.node) SELECT node FROM reached WHERE node<>'A' ORDER BY node;
更正查詢的逐行結果
節點
B
C
D
下載可編輯 CSV ↓

錯清單 B、C、D、D,更正 B、C、D。行只放 node 很重要,加路徑或深度便改去重相等意思,要另訂遍歷模型。

用新副本測邊界

新邊界副本加 D→A,只執行更正 UNION 查詢,會以 B、C、D 結束。錯誤 UNION ALL 只在原無循環例子執行。

另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。

邊界改動及更正查詢
INSERT INTO edges VALUES('D','A');
WITH RECURSIVE reached(node) AS (VALUES('A') UNION SELECT e.target FROM edges e JOIN reached r ON e.source=r.node) SELECT node FROM reached WHERE node<>'A' ORDER BY node;
邊界查詢的逐行結果
節點
B
C
D
下載可編輯 CSV ↓

回到 A 會令更正報表加 A 或再加 D 嗎?

查看參考答案

不會,已排節點行不再加入,輸出又剔起點 A,使用者仍 B、C、D。

相關資源