mysql
- 公用表表达式-CTE
公用表表达式是一个命名的临时结果集,不作为对象存储,只在执行期间存在。
CTE基本语法:
with cite_name as
(
query
)
select *
from cite_name
;
- CTE的递归查询
CTE的递归查询就是需要不断的去“引用”CTE本身。
基本语法:
with recursive cte_name as
(
initial_query -- anchor member
union all
recursive_query -- 引用CTE名称的递归成员
)
select *
from cte_name
;
CTE递归查询主要有三部分:
① 初始查询,形成递归查询的初始结果集
② 递归查询部分,引用CTE名称的查询
③ 终止条件,确保查询在不满足条件时终止
输出结果:
+---+
| n |
+---+
| 1 |
| 2 |
| 3 |
+---+
3 rows in set (0.01 sec)
注意:
递归部分,不能使用 聚合函数,distinct ,group by 子句, order by 子句,limit子句。
测试语句:
with recursive party_detail as
(
select id, depart_name, depart_name as dept_structure
from ent_department
where id=100 -- 根部门ID
union
select a.id ,a.depart_name, concat(b.dept_structure, ' > ', a.depart_name) as dept_structure
from party_detail as b
join ent_department as a on b.id=a.parent_id
)
select *
from party_detail
;
效果:
oracle
先看表格结构
那对于树状结构如何查询呢?Oracle提供递归查询的方式进行查询,基本语法如下:
SELECT [Column]…..
FEOM [Table]
WHERE Conditional1
START WITH Conditional2
CONNECT BY PRIOR Conditional3
ORDER BY [Column]
说明:
条件1—过滤条件,对全部返回的记录进行过滤。
条件2—根节点的限定条件,固然也可以放宽权限得到多个根节点,也就是获取多个树
条件3—链接条件,目的就是给出父子之间的关系是什么,根据这个关系进行递归查询(在上述表中就是REC_CODE=PARENT_CODE)
排序—对全部返回记录进行排序
你如果是根据节点往下查 PRIOR 放在前面;
SELECT *
FROM SYS_REC t
START WITH t.REC_CODE='350124'
CONNECT BY PRIOR t.REC_CODE = t.PARENT_CODE
如果是根据节点往上查PRIOR 放在后面;
SELECT *
FROM SYS_REC t
START WITH t.REC_CODE='350124'
CONNECT BY t.REC_CODE = PRIOR t.PARENT_CODE
如果希望拼接的话就是
SELECT
t.REC_CODE,
SYS_CONNECT_BY_PATH ( t.REC_NAME, '\' ) AS REC_NAME
FROM
SYS_REC t START WITH t.REC_CODE ='350124' CONNECT BY PRIOR t.REC_CODE = t.PARENT_CODE
到这里就记录完啦