Question

for a simple data structure such as so:

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

Is that possible to use CTE to result as:

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

I want to create registers for every found vehicle type, tried everything without success.

Was it helpful?

Solution

You can use a recursive 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
;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top