準備報表輸入
本例 A 可達的每節點只列一次,不列 A 自己。菱形圖由 B、C 都到 D。遞迴 UNION ALL 把兩條路都排入;只含 node 的 UNION 行才抑重複節點。
以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。
| 起點 | target |
|---|---|
| A | B |
| A | C |
| B | D |
| C | D |
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');比較錯誤及更正結果
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 |
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 |
錯清單 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 |
回到 A 會令更正報表加 A 或再加 D 嗎?
查看參考答案
不會,已排節點行不再加入,輸出又剔起點 A,使用者仍 B、C、D。