我正在研究 SQL Server 中的遞回。我有以下查詢,我似乎無法讓它做我想做的事。
;WITH cte_txn AS (
SELECT
vth_id,
vth_pol_id,
vth_moved_from_vth_id
FROM Variant_Transaction_Header
UNION ALL
SELECT
e.vth_id,
e.vth_pol_id,
e.vth_moved_from_vth_id
FROM Variant_Transaction_Header e
JOIN cte_txn ON cte_txn.vth_moved_from_vth_id = e.vth_id
)
SELECT * FROM cte_txn;
如果我在錨中指定一個 vth_id(在本例中為“WHERE vth_id = 72418”),我會得到以下資訊:
vth_id vth_pol_id vth_moved_from_vth_id
72418 NULL 57019
57019 NULL 53518
53518 803 NULL
這是偉大的。但現在我想將上面的資料轉換成:
vth_id vth_pol_id vth_moved_from_vth_id
72418 803 57019
57019 803 53518
53518 803 NULL
換句話說,我想要最深祖先的 vth_pol_id,無論我插入哪個 vth_id。最好的方法是什么?
編輯:我應該指定我想要一個包含所有分支的結果集,其中 vth_pol_id 基本上表示每個記錄所在的分支。
uj5u.com熱心網友回復:
我試圖從后代變成祖先。另一種方式更可取,因為我需要父記錄中的值與子記錄一起使用。這是更新后的運算式:
;WITH cte_txn AS (
SELECT
vth_id,
vth_pol_id,
vth_moved_from_vth_id
FROM Variant_Transaction_Header
/*start at the base of the branch instead of the end.*/
WHERE NOT vth_pol_id IS NULL
UNION ALL
SELECT
e.vth_id,
/* use parent's vth_pol_id */
cte_txn.vth_pol_id,
e.vth_moved_from_vth_id
FROM Variant_Transaction_Header e
/* Move away from ancestor instead of toward. */
JOIN cte_txn ON cte_txn.vth_id = e.vth_moved_from_vth_id
WHERE cte_txn.vth_id <> e.vth_id
)
/* Join again with vth for all records */
SELECT
v.vth_id,
c.vth_pol_id,
v.vth_moved_from_vth_id
FROM Variant_Transaction_Header v
LEFT OUTER JOIN cte_txn c ON c.vth_id = v.vth_id
外連接是為了確保如果根節點恰好在vth_pol_id列中有一個空值,仍然回傳所有記錄。更簡單的:
SELECT * FROM cte_txn;
如果要省略此類記錄,則可以使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479629.html
上一篇:有沒有辦法自動遞增計數?
