首页 > 数据库 >关于Sql server数据类型HierarchyID 数据类型用法和递归显示完整路径

关于Sql server数据类型HierarchyID 数据类型用法和递归显示完整路径

时间:2024-03-13 16:11:32浏览次数:28  
标签:City SimpleDemo 数据类型 HierarchyID location Sql path 1000

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

最原始链接可以参考

https://learn.microsoft.com/zh-cn/sql/relational-databases/hierarchical-data-sql-server?view=sql-server-ver16

 

标签:City,SimpleDemo,数据类型,HierarchyID,location,Sql,path,1000
From: https://www.cnblogs.com/tracy/p/18070870

相关文章

  • MYSQL- 使用SQL99 实现7种JOIN 操作
    DESCemployees; DESCdepartments;   ##中图就是内连接SELECTlast_name,department_nameFROMemployeeseJOINdepartmentsdONe.department_id=d.department_id##sql99内连接SELECTlast_name,department_name,cityFROMemployeeseINNERJOIN......
  • MYSQL 主从不一致的原因分析
    数据库作为存储数据的组件,数据的一致性一定是要保证的前提,今天给出两个场景来分析数据不一致的原因。binlog同步模式导致主从不一致在MYSQL中主库向从库同步数据是利用binlog记录修改操作,然后将binlog传递给从库进行复制,binlog的格式有3种,row在对update,delete,insert语句进行......
  • sql:delete if exists还是drop if exists?
    在本文中,我们将介绍在执行INSERT、UPDATE、DELETE操作之前使用SQL的IFEXISTS进行优化的方法。我们将了解这种方法的优势,以及如何在不同的数据库管理系统中使用它。参考:https://deepinout.com/sql/sql-questions/124_sql_if_exists_before_insert_update_delete_for_optimization......
  • SQL Server 因设置最大内存过小导致无法启动
    首先是    在服务器上发现SQLServer占用内存过大,128G服务器内存它占用高达100多G。于是就去找解决方案,找了几篇文章发现都是通过修改SQLServer服务器最大内存让其释放占用内存,如图所示,我把最大内存修改为128MB发现问题    然后我就发现我的SQLServer服务无......
  • day 06-1 数据类型(列表)
    day06列表常见的数据类型int,整数类型(整型)bool,布尔类型str,字符串类型list,列表类型:用于储存一些数据的容器(有序&可修改),动态的容器tuple,元组类型:用于储存一些数据的容器(有序&不可修改),固定的容器dict,字典类型set,几何类型float,浮点类型(浮点型)1列表列表(list),是一......
  • MySQL遇到的一些坑
    坑第一大坑后端代码没问题,前端拉取代码的时候拉取的是master分支,而master分支还没有跟新到最新进度,导致某些菜单访问正常但是有几个菜单模块访问不了,浏览器进度条卡住后端也要改,可以重新拉取或者merge,后端和前端要对应上gitpullhttp://117.73.11.3:8090/WindPowerPrediction......
  • mysql如何保证数据一致性
    MySQL保证数据一致性的主要方式有以下几种:事务支持:MySQL支持事务,通过事务可以保证数据库操作要么全部执行成功,要么全部失败回滚,从而确保数据的一致性。ACID特性:MySQL遵循ACID(原子性、一致性、隔离性、持久性)特性,其中一致性是指事务执行前后数据的状态保持一致。在事......
  • 基于Java+Vue+Mysql的门店管理系统(附配套文档和源码)【毕业设计分享】
          前言:门店管理系统是一个综合性的软件解决方案,旨在帮助门店高效地管理日常运营、提升服务质量、优化资源配置和增强决策能力。以下是您提到的各个管理模块的简要概述:门店管理:门店信息管理:记录门店的基本信息,如门店名称、地址、联系方式、营业时间等。门店布局管......
  • 基于Java+Vue+Mysql的WMS仓库管理系统(附配套文档和源码)【毕业设计分享】
          前言: WMS(WarehouseManagementSystem)仓库管理系统是一个用于优化仓库操作、提高效率和准确性的软件解决方案。以下是针对列出的WMS仓库管理系统的各个部分的简要描述:1.订单管理订单管理是WMS的核心功能之一,涉及处理、跟踪和完成客户订单。这包括:订单录入:......
  • SQL注入攻击与防范:案例分析与最佳实践
    SQL注入是一种常见的安全漏洞,攻击者利用此漏洞向应用程序的数据库发送恶意SQL查询,以执行未经授权的操作或获取敏感数据。以下是一些预防SQL注入的常见方法:使用参数化查询:使用参数化查询可以有效防止SQL注入攻击。参数化查询将用户输入的数据作为参数传递给查询,而不是将其......