--根据角色id 递归查询此角色以及其子角色
WITH RECURSIVE tir AS
(
SELECT tir1.* FROM t_id_role tir1 WHERE tir1.id in ('027c6a0e7fcbc405f2ebb0f394388699')
UNION ALL
SELECT tir2.* FROM t_id_role tir2,tir tir3 where tir3.id = tir2.pid
)
SELECT * from t_id_role
where id in (SELECT id FROM tir t);
设定递归语法,首先初始执行第一句
SELECT tir1.* FROM t_id_role tir1 WHERE tir1.id in ('027c6a0e7fcbc405f2ebb0f394388699')
其结果给到tir,当tir的值发生改变,就会执行:
UNION ALL -- 可重复并集
SELECT tir2.* FROM t_id_role tir2,tir tir3 where tir3.id = tir2.pid
将tir AS 别名为 tir3,从表中查询t_id_role别名tir2.pid=tir3.id的数据,其实就是查询以tir的id为父节点pid的列,将查询出的结果给到tir,由于tir发生更改,递归执行查询语句。最后将查询结果给到
SELECT * from t_id_role where id in 中,查出角色以及后续所有子角色。
注意:WITH AS () 后面必须跟着 [ SELECT| INSERT | UPDATE | DELETE] 语句,否则报错。
WITH RECURSIVE cte_name AS (
初始语句(非递归部分)
UNION ALL
递归部分语句
)
[ SELECT| INSERT | UPDATE | DELETE]
理解 :
初始语句 :就是第一次给 cte_name ( 相当于 视图名 或 表名 )
递归部分语句 :当 cte_name 的值 发生改变时,就会执行 此递归语句;而 此递归语句会把 其执行> 结果重新赋值给 cte_name,直到达到此递归语句的结束条件 。
cte_name 每一次的重新赋值,都会使 with recursive AS( )后面的 [ SELECT| INSERT | UPDATE > | DELETE] 语句执行一次。
而最终结果就是 多次 [ SELECT| INSERT | UPDATE | DELETE] 语句执行结果的合集。