sql-server 在给定字符串路径的情况下查找叶节点的hierarchyid的最佳方法

mitkmikd  于 2022-10-31  发布在  其他
关注(0)|答案(1)|浏览(131)

给定路径“Applications/Accounting/Dashboard”,名为“Dashboard”的叶节点的hierarchyid是什么。我提出了此解决方案,但它是否是最佳解决方案?
我使用的表和数据中,父节点的所有子节点都具有唯一的名称。

  1. CREATE TABLE [dbo].[Resources](
  2. [Node] [hierarchyid] NOT NULL,
  3. [Name] [nvarchar](50) NOT NULL
  4. ) ON [PRIMARY]
  5. GO
  6. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/', N'Resource Root')
  7. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/1/', N'Applications')
  8. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/1/1/', N'Accounting')
  9. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/1/1/1/', N'Dashboard')
  10. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/1/2/', N'Asset Management')
  11. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/1/2/1/', N'Dashboard')
  12. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/2/', N'Assets')
  13. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/2/1/', N'X100022')
  14. INSERT [dbo].[Resources] ([Node], [Name]) VALUES (N'/2/2/', N'X100017')
  15. GO

“资源”表包含由路径“应用产品/会计/ Jmeter 板”表示的层次结构。下面的服务提供商将获取名为“ Jmeter 板”的叶节点。

我想知道是否可以在没有游标的情况下完成此操作。或者是否有更高性能的方法来完成此操作?

第一个
返回正确的0x 5AD 6。

ncecgwcz

ncecgwcz1#

  1. SELECT
  2. A.HieracrchyId
  3. ,A.HierarchyId.ToString()
  4. FROM [dbo].[Resources] AS A
  5. LEFT OUTER JOIN [dbo].[Resources] AS B
  6. ON A.HierarchyId = B.HierarchyId.GetAncestor(1)
  7. WHERE B.HierarchyId IS NULL

关于hierarchyid的使用,有一些很好的(但很冗长)说明,其中包括对GetAncestor()和GetChild()等方法的描述。
在sql中还有其他表示层次结构的方法,你可以考虑一下闭包表,如果你不担心存储图的边会占用额外的空间,在某些情况下闭包表会更有性能。

相关问题