[英]Chaining joins in SQL based on dynamic table
標題可能不正確,但問題就來了! 我有下表:
id1 id2 status
1 2 a
2 3 b
3 4 c
6 7 d
7 8 e
8 9 f
9 10 g
我想基於動態鏈連接獲取第一個id1
和最后一個status
,這意味着結果表將為:
id final_status
1 c
6 g
從邏輯上講,我想基於將表連接到自身來構造以下數組:
id1 chained_ids chained_status
1 [2,3,4] [a,b,c]
6 [7,8,9,10] [d,e,f,g]
然后獲取chained_status
列表的最后一個元素。
因為如果我們要繼續將表以id1 = id2
連接到自身,那么最終將只有一行具有這些結果。 問題在於聯接的數量不是恆定的(單個id
可能被鏈接很多或幾次)。 id1
到id2
始終存在1對1的映射。
提前致謝! 這可以在T-SQL或Hive中完成(如果有人有一個聰明的map-reduce解決方案)。
您可以使用遞歸CTE進行此操作:
;WITH My_CTE AS
(
SELECT
id1,
id2,
status,
1 AS lvl
FROM
My_Table T1
WHERE
NOT EXISTS
(
SELECT *
FROM My_Table T2
WHERE T2.id2 = T1.id1
)
UNION ALL
SELECT
CTE.id1,
T3.id2,
T3.status,
CTE.lvl + 1
FROM
My_CTE CTE
INNER JOIN My_Table T3 ON T3.id1 = CTE.id2
)
SELECT
CTE.id1,
CTE.status
FROM
My_CTE CTE
INNER JOIN (SELECT id1, MAX(lvl) AS max_lvl FROM My_CTE GROUP BY id1) M ON
M.id1 = CTE.id1 AND
M.max_lvl = CTE.lvl
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.