2016-01-05 66 views
2

李正在試圖壓平/從表一中父子層次相結合的行。我試圖找出開始,每個「鏈接」的結束 - 所以,如果一個鏈接到bb鏈接到ç,然後ç鏈接到d ,我想輸出鏈接一個d聯合親子行 - TSQL

我想我最好避免使用與循環的過程,所以任何建議,將不勝感激!

的原始數據集和所需的輸出如下所示:

personID | form | linkedform 
---------|---------|--------- 
    1 | a | b 
    1 | b | c 
    1 | c | d 
    1 | d | NULL 
    2 | e | f 
    2 | f | g 
    2 | g | NULL 
    2 | h | i 
    2 | i | NULL 
    3 | j | NULL 
    3 | k | l 
    3 | l | NULL 

希望的輸出:

personID | form | linkedform 
---------|---------|--------- 
    1 | a | d 
    2 | e | g 
    2 | h | i 
    3 | j | NULL 
    3 | k | l 

每個PERSONID可以有多個鏈接以及鏈接可以由僅一個或多個的形式。

+0

這看起來像使用max函數的簡單GROUPBY。 編輯:關於第二個想法,也許不是...... – user2366842

+0

在我看來,你希望每個人的所有形式的葉節點,這是在tSQL中用遞歸CTE處理的。 @ user2366842我不這麼認爲。查看存在多條路徑的personID 3或2。 – xQbert

+0

下面是和[SQL小提琴](http://sqlfiddle.com/#!6/9100c/2)示出了遞歸CTE。從這裏開始,所需的輸出只有幾步之遙。 – xQbert

回答

0
-- use a recursive cte to build the hierarchy 
-- start with [linkedform] = null and work your way up 
;WITH cte AS 
(
    SELECT *, [form] AS [root], 
      1 AS [Level] 
    FROM Table1 
    WHERE [linkedform] IS NULL 
    UNION ALL 
    SELECT t1.*, 
      [root], 
      [Level] + 1 
    FROM Table1 t1 
    JOIN cte ON cte.form = t1.linkedform 
) 
-- level 1 will be the last element, use row_number to get the first element 
-- join the two together based on last and first level, that have the same personid and root ([linkedform] = null) 
SELECT cte.personId, 
     cte2.form, 
     cte.form 
FROM cte 
     JOIN ( SELECT *, 
         ROW_NUMBER() OVER (PARTITION BY personId, [root] ORDER BY Level DESC) Rn 
       FROM cte) cte2 
      ON cte2.Rn = cte.Level 
       AND cte2.personId = cte.personId 
       AND cte2.root = cte.root 
WHERE cte.[Level] = 1 
ORDER BY cte.personId, cte2.form 
+0

非常感謝您的支持(以及有用的額外評論)。非常感激! – Leigh