【问题标题】:CTE duplicate referencesCTE 重复引用
【发布时间】:2014-03-26 18:22:20
【问题描述】:

对于一个简单的数据结构如:

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

我想为每个找到的车辆类型创建寄存器,尝试了一切都没有成功。

【问题讨论】:

  • VehicleType 对我来说似乎很不寻常。它提供什么信息?

标签: sql-server common-table-expression hierarchical-data


【解决方案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
;

【讨论】:

  • Tks Bate,有什么线索可以显示递归级别吗?例如:汽车、高尔夫 = 2 级 |载具,125 = 0 级
  • 我更新了答案以包含一个“recLevel”列,我认为它应该可以满足您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2013-03-16
相关资源
最近更新 更多