簡體   English   中英

基於動態表的SQL鏈接聯接

[英]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可能被鏈接很多或幾次)。 id1id2始終存在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM