使用SQL进行递归查询
在工作当中会经常用到递归,比如菜单的展示。一种方法就是从数据库中取出所有的数据,然后在程序中循环获取符合条件的数据。另外一种方法就是使用SQL直接读取符合条件的数据。对于递归查询,T-SQL和PL/SQL进行了不同的处理。
以表Deparment为例
表结构为:
Id 部门内码,
DeptCode 部门编码,
ParentDeptId 上级部门内码
使用T-SQL:
with Dep as
( select Id,DeptCode,DeptName from Department where Id=1 union all select d.Id,d.DeptCode,d.DeptName from Dep inner join Department d on dep.Id = d.ParentDeptId
) select * from Dep
.csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) } .csharpcode pre { margin: 0 } .csharpcode .rem { color: rgba(0, 128, 0, 1) } .csharpcode .kwrd { color: rgba(0, 0, 255, 1) } .csharpcode .str { color: rgba(0, 96, 128, 1) } .csharpcode .op { color: rgba(0, 0, 192, 1) } .csharpcode .preproc { color: rgba(204, 102, 51, 1) } .csharpcode .asp { background-color: rgba(255, 255, 0, 1) } .csharpcode .html { color: rgba(128, 0, 0, 1) } .csharpcode .attr { color: rgba(255, 0, 0, 1) } .csharpcode .alt { background-color: rgba(244, 244, 244, 1); width: 100%; margin: 0 } .csharpcode .lnum { color: rgba(96, 96, 96, 1) }
简单解释一下:with as属于sql server新特性CTE(Common Table Expression)的关键字,用来储存临时结果集。常用于代替子查询。本例中可以理解为,找出Id=1的记录后,存放在临时表Dept中,然后临时表和Department进行内连接,找出它的子记录。子记录和第一条记录union后作为Dept新的结果集继续进行内连接,找出新的子记录。
使用PL/SQL:
select Id,DeptCode,DeptName
from Department
start with Id = 1
connect by prior Id = ParentDeptId;
start with 表示从哪一行记录开始递归查询,即根节点 connect by 表示进行递归,后面跟递归条件 prior 表示前一条记录,表示上一条记录的Id = 下一条记录的ParentDeptId 比如上面的SQL语句就可以理解为,以Id 为1的记录为根节点,递归查询下一条记录的ParentDeptId = 前一条记录的Id
以上,对使用SQL进行递归查询进行了简单的总结,作为备忘录吧,希望也可以对大家有所帮助,谢谢!
使用SQL进行递归查询相关推荐
- SQL 语句递归查询 With AS 查找所有子节点
SQL 语句递归查询 With AS 查找所有子节点 create table #EnterPrise ( Department nvarchar(50),--部门名称 ParentDept ...
- sql oracle 递归查询语句,深入sql oracle递归查询
☆ 获取数据库所有表名,表的所有列名 select name from sysobjects where xtype='u' select name from syscolumns where id= ...
- oracle 递归查询,深入sql oracle递归查询
☆ 获取数据库所有表名,表的所有列名 select name from sysobjects where xtype='u' select name from syscolumns where i ...
- oracle用一个字段往上递归,深入sql oracle递归查询
获取数据库所有表名,表的所有列名 select name from sysobjects where xtype='u' select name from syscolumns where id=(s ...
- sql oracle 递归查询语句,oracle递归函数 oracle中SQL递归查询
关于oracle递归调用的自定义函数如何结束 比如存储过程a中有b,b中含a.用return结束判断,执行还是锁表,怎么解决 关于oracle递归调用的自定义函数如何结束 可以调用. C语言最基本的模 ...
- sql oracle 递归查询语句,Oracle使用SQL语句进行递归查询
id pid 问题描述: 1 0 2 0 3 1 4 1 5 2 6 2 7 3 8 4 9 5 取出id为1及其下属的所有的数据,结果为下 id pid 1 0 3 1 4 1 7 3 8 4 SQ ...
- oracle中sql的递归查询运用
当表自查询的时候,就基本会用到递归的查询 比如一个员工表 主键 名字 职位 上级id 部门id i ...
- SQL SERVER 递归查询(4)——递归层级查询
我们在做递归查询的时候,有时候需要查询特定某一级的数据,如果我们的数据上没有标注该数据的层级数,那么我们可以在递归的时候自己加一个,并在读取的时候作为查询条件来用,测试数据: --测试数据 if no ...
- SQL Server递归查询无限级分类
2019独角兽企业重金招聘Python工程师标准>>> WITH cte_parent(OrderOpenId, SharedOpenId, SubjectId) AS (SELEC ...
最新文章
- k-means聚类算法从入门到精通
- php函数间参数传递(值传递/引用传递)
- 有点长的 Java API 设计清单
- opencv python matplotlib.pyplot.hist() 如何绘制灰度直方图,如何根据灰度直方图确定最优二值化值
- 阿里巴巴DevOps实践指南 | 为什么DevOps的必然趋势是BizDevOps?
- 廖雪峰Java10加密与安全-4加密算法-5非对称加密算法
- dubbo-admin构建报错
- nlp2-数学基础(信息论,概率论、词义消歧)
- UE3 光照 阴影
- 被“薅羊毛”损失200多万!元气森林:系运营事故
- 行测(爆发篇)之语句表达,像说话一样自然
- SSL-Explorer 安装配置
- JAVA开发环境搭建
- html当前时间插件,HTML日期时间插件
- 找不到或无法加载主类怎么办
- CSS3之图片列表展示特效
- word2019如何删除段落文字带颜色的背景
- KVstore 笔记【随时增】
- 关于MySQL错误提示ERROR 1265 (01000)的问题分析及解决方案
- 枢轴点(Pivot Point)系统
热门文章
- C++实现connected component连通分量(附完整源码)
- 数组中只出现1次的2个数
- QT的QDBusPendingCallWatcher类的使用
- c++STL算法基础
- 经典C语言程序100例之四二
- 经典C语言程序100例之四零
- css 渐变色_如何设置渐变色的单元格值?
- 卡尔曼滤波器求速度matlab,卡尔曼滤波器算法浅析及matlab实战
- Ambari2.7.4+HDP3.1.4下sqoop增量导入只支持append模式,mysql直接进入hive的lastmodified的不支持。下面是增量的命令。
- ibatis中多表联接查询