SQL Server 根据树状结构表生成以/号分割的路由字符串
很多情况下,我们有必要把树形结构进行数据梳理。比如,要方便的过滤出一个父节点下的所有子节点等等。。。
这个时候,我们可以生成一个路径表字符串,在应用时只需要对该字符串进行索引即可达成目的。
目标:按图示的部门结构树,获取本身的完整路径字符串。比如,前道工序部门,其部门代码为PDTE,上级部门为PD生产部,按结构树获取到一个/PD/PDTE/的字符串。

先来一个简单点的展示:
WITH T AS (SELECT CAST('/' + DeptCode + '/' AS NVARCHAR(MAX)) AS DpPath, DeptRKEY AS DpKey
FROM Base_Department
WHERE (ILevel = 1)--指定父级起点
UNION ALL
SELECT CAST(t.DpPath + D.DeptCode + '/' AS NVARCHAR(MAX)) AS DpPath, D.DeptRKEY AS DpKey
FROM Base_Department AS D INNER JOIN
T ON D.ParentRKEY = T.DpKey)--设置递归关联
SELECT DpPath, DpKey FROM T--输出结果
输出如下图:

然后开个稍微复杂点的,带上级机构关联上:
WITH T AS (SELECT '/' + CAST(DeptCode AS NVARCHAR(MAX)) + '/' AS DpPath, DeptRKEY AS DpKey, DeptNameLL AS DpNameLL, DeptNameLI AS DpNameLI, ILevel AS DpLevel, ISEQ AS DpSEQ,
BranchRKEY
FROM Base_Department
WHERE (ILevel = 1)
UNION ALL
SELECT CAST(t.DpPath + D.DeptCode + '/' AS NVARCHAR(MAX)) AS DpPath, D.DeptRKEY AS DpKey, D.DeptNameLL AS DpNameLL, D.DeptNameLI AS DpNameLI, D.ILevel AS DpLevel,
D.ISEQ AS DpSEQ, D.BranchRKEY
FROM Base_Department AS D INNER JOIN
T ON D.ParentRKEY = T.DpKey)
SELECT '/' + BranchCode + '/' AS DpPath, BranchCode AS DpKey, BranchNameLL AS DpNameLL, BranchNameLI AS DpNameLI, 0 AS DpLevel, 0 AS DpSEQ
FROM Base_Branch
UNION ALL
SELECT '/' + B.BranchCode + T.DpPath AS Expr1, STR(T.DpKey) AS DpKey, T.DpNameLL, T.DpNameLI, T.DpLevel, T.DpSEQ
FROM T INNER JOIN
Base_Branch AS B ON T.BranchRKEY = B.BranchRKEY
输出如下:

如果,某些场合下,就能很好的利用这个DpPath了。
SQL Server 根据树状结构表生成以/号分割的路由字符串的更多相关文章
- oracle存储过程删除树状结构的表数据
今天在删除一个车辆品牌表的时候,遇到了一个问题,是在java的代码中做逻辑删除还是直接在Oracle中一次删除完成呢 思来想去觉得还是在sql里直接删除比较合适, 为什么呢? 第一,涉及数据库的读写操 ...
- oracle 树状结构递归 PL/SQL输出控制 包括空格输出控制
树状结构 存储过程中通过递归构建,类似BBS回帖显示,代码共三段: 建表,插入数据,创建存储过程显示: 1.create table article(id number primary key,con ...
- EntityFrameworkCore 单表树状结构配置
数据结构 public class TreeNode { [Key] public long Id { get; set; } public string NodeName { get; set; } ...
- python 生成 树状结构
树状结构: 字典里只有一个键值对, key 为根, 值为一个列表, 列表里的某个或多个元素可以再进行分支(分支还是列表) 比如: 邮件的发件人, 收件人, 转发关系树状结构 forwarding_re ...
- 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- 浅谈oracle树状结构层级查询测试数据
浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...
- sql Server中临时表与数据表的区别
sql server 中临时表与数据表的区别 1.如何判断临时表和数据表已生成 --如何判断临时表是否已创建--- if exists(select * from tempdb..sysobjects ...
- 转:Sql Server中清空所有数据表中的记录
如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍. 使用sql删除数据库中所有表是不难的 ...
- openerp学习笔记 对象间关系【多对一(一对一)、一对多(主细结构)、多对多关系、自关联关系(树状结构)】
1.多对一(一对一)关系:采购单与供应商之间的关系 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, sta ...
随机推荐
- SVN代理设置
[SVN代理设置] ~/.subversion/servers文件下可以配置svn的代理. 打开上面那3行,替换为自定义的域名即可.
- LUA Metatables
__index:当我们访问一个表中的元素不存在时,则会触发去寻找__index元方法,如果不存在,则返回nil,如果存在,则返回结果. 博主注:__index有点像异常处理的意思 __newindex ...
- 使用mybatis开发Dao的原始方法,实现根据用户id查询一个用户信息 、根据用户名称模糊查询用户信息列表 、添加用户信息等功能
1.需求 将下边的功能实现Dao: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户信息 2. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类 3.User.xml映 ...
- Golang之Struct(二叉树定义)
接招吧,看代码: package main import "fmt" //二叉树结构体 //如果每个节点有两个指针,分别用来指向左子树和右子树,我们把这样的结构叫做二叉树 type ...
- Linux之RPM GPG签名
原文地址:http://linux.chinaunix.net/techdoc/system/2007/09/26/968723.shtml GPG在Linux上的应用主要是实现官方发布的包的签名机制 ...
- Struts2,Spring3,Hibernate4整合--SSH框架
Struts2,Spring3,Hibernate4整合--SSH框架(学习中) 一.包的导入 1.Spring包 2.Hibernate 包 3.struts 包 (还欠 struts2-sprin ...
- [Selenium]刷新页面 Refresh page
5 different ways to refresh a webpage using Selenium Webdriver Here are the 5 different ways, usin ...
- Oracle学习笔记(六)
八.函数 1.函数的作用 (1)方便数据的统计 (2)处理查询结果,让数据显示更清楚 2.函数分类(提供很多内置函数,也可自定义函数) (1)数值函数 平均值,四舍五入 a.四舍五入 表达式 roun ...
- struct 和union的区别
union ( 共用体):构造数据类型,也叫联合体 用途:使几个不同类型的变量共占一段内存(相互覆盖) struct ( 结构体 ):是一种构造类型 用途: 把不同的数据组合成一个整体——自定义数据 ...
- vue2.0 #$emit,$on的使用
首先实例化: bus.js import Vue from 'Vue' export default new Vue() 组件1, import bus from '../../assets/js/b ...