由于项目的原因接触了三种数据库,分别是Oracle、MySQl、PostgreSQL,在此记录一下三种数据库递归查询的用法(以查询某节点下所有子节点为例)!
1、Oracle——有自带的递归函数,一般最上级我都不用递归,直接查全部
select t.* from sys_postorg t start with id = '11010101' connect by prior parent_id = id
2、MySQl——这个写法我在数据量4万的情况下速率极慢,不建议使用,而且占临时内存。
select id from (select t1.id,
if(find_in_set(parent_id , @pids) > 0, @pids := concat(@pids, ',', id), 0) as ischild
from (
select id,parent_id from sys_postorg t order by parent_id ,id
) t1,(select @pids := #{orgId}) t2) t3 where ischild != 0
3、PostgreSQL——没有递归函数
WITH RECURSIVE r AS (
SELECT * FROM sys_postorg WHERE id = 7
UNION ALL
SELECT sys_postorg .* FROM sys_postorg , r WHERE sys_postorg .id = r.parent_id
)
SELECT * FROM r ORDER BY id;
数据量大的情况下影响速率,优化问题看具体情况。