对于数据库表中的大类,小类我们基本一直在使用id ,parentid的方式,今天发现了一种更清晰,更完美的解决方式。
SQL Server 2008版本之后的新类型HierarchyID 不知道大家有没有了解, 该类型作为取代id, parentid的一种解决方案,让人非常惊喜。
官方给的案例浅显易懂,但是没有实现我想要的基本功能,树形结构中完整名称路径的展示。本文末尾是一个完整路径的样例,需要更多基本操作可以参考文末微软链接
另外,现在基本不太碰Oracle数据库了,平时也没怎么研究SQL Server.
希望本文对有这方面需求的同学有一定帮助,完整示例如下
内置的 hierarchyid 数据类型使存储和查询层次结构数据变得更为容易。
下面为一个完整的实现例子
数据表的准备和结构
CREATE TABLE SimpleDemo ( Level hierarchyid NOT NULL, Location nvarchar(30) NOT NULL, LocationType nvarchar(9) NULL );
现在插入一些洲、国家/地区、州和城市的数据。
INSERT SimpleDemo VALUES ('/1/', 'Europe', 'Continent'), ('/2/', 'South America', 'Continent'), ('/1/1/', 'France', 'Country'), ('/1/1/1/', 'Paris', 'City'), ('/1/2/1/', 'Madrid', 'City'), ('/1/2/', 'Spain', 'Country'), ('/3/', 'Antarctica', 'Continent'), ('/2/1/', 'Brazil', 'Country'), ('/2/1/1/', 'Brasilia', 'City'), ('/2/1/2/', 'Bahia', 'State'), ('/2/1/2/1/', 'Salvador', 'City'), ('/3/1/', 'McMurdo Station', 'City');
此外,此表未使用层次结构顶层 ‘/’。 该层被省略,因为没有所有州的公共父级。 可以通过添加整个星球来添加一个顶层。
INSERT SimpleDemo VALUES ('/', 'Earth', 'Planet');
看下面的语句是通过GetAncestor 来达到完整路径显示的关键。
下面实现显示完整路径的SQL脚本
WITH ancestor_path AS ( SELECT [level], location, CAST(LEVEL.GetAncestor(1) AS VARCHAR(1000)) AS parent_id, CAST(location AS VARCHAR(1000)) AS path FROM SimpleDemo WHERE LocationType = 'Planet' UNION ALL SELECT d.[level], d.location, CAST(d.LEVEL.GetAncestor(1) AS VARCHAR(1000)), CAST(CONCAT ( ap.path, ' > ', d.location ) AS VARCHAR(1000)) FROM SimpleDemo d JOIN ancestor_path ap ON d.[level].GetAncestor(1) = ap.[level] ) SELECT * FROM ancestor_path; SELECT CAST(LEVEL.GetAncestor(1) AS VARCHAR(1000)) AS LevelName, location, locationtype FROM SimpleDemo
最原始链接可以参考
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。