2014-03-26 19 views
0

一個簡單的數據結構,如這樣:CTE重複引用

ID parentID Name  (Table: VehicleType) 
1     Vehicle 
2  1   Small 
3  2   Car 
4  2   Motorcycle 
5  1   Medium 
6  5   Pickup 

ID ItemType Name  (Table: Vehicle) 
1  3   Golf 
2  4   125 

是不是可以使用CTE以結果爲:

VehicleType Name 
Vehicle  Golf 
Small   Golf 
Car   Golf 
Vehicle  125 
Small   125 
Motorcycle 125 

我想創建爲每發現車輛類型寄存器,嘗試一切都沒有成功。

+0

表'VehicleType'看似尋常給我。它給了什麼信息? –

回答

1

您可以使用遞歸CTE http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

;WITH cteRecursiveTypes as 
(
    SELECT baseTypeID = t.ID, typeID = t.ID, t.parentID, VehicleType = t.Name, recLevel = 1 
    FROM VehicleType t 

    UNION ALL 

    SELECT t.baseTypeID, parentT.ID, parentT.parentID as parentID, VehicleType = parentT.Name, recLevel = t.recLevel + 1 
    FROM cteRecursiveTypes t 
    INNER JOIN VehicleType parentT on t.parentID = parentT.ID 

) 
SELECT t.VehicleType, v.Name, recLevel = dense_rank() over(partition by t.baseTypeID order by t.recLevel desc) - 1 
FROM Vehicle v 
INNER JOIN cteRecursiveTypes t on v.ItemType = t.baseTypeID 
ORDER BY 2,1 
; 
+0

Tks Bate,任何顯示遞歸級別的線索?例如:Car,Golf = Level 2 |車輛,125 =級別0 – Alexandre

+1

我更新了答案,包括一個「recLevel」列,我認爲應該給你想要的。 – BateTech