sql递归查询

sql递归查询_第1张图片

sql递归查询_第2张图片

一、postgresql

sql递归查询_第3张图片

递归sql

with recursive p as
    (select t1.* from t_org_test t1 where t1.id=2
    union all
    select t2.*from t_org_test t2 join p on t2.parent_id=p.id
    )
select id,name,parent_id from p;

 sql递归查询_第4张图片

sql中with xxxx as () 是对一个查询子句做别名,同时数据库会对该子句生成临时表;
with recursive 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询
p为自定义临时表名,最后一句select后跟的字段必须小于等于t1和t2中字段。
第二句where后面跟的是起始数据,第四句后面可以加where条件来判断终止条件
向上递归把t2.parent_id=p.id改为t2.id=p.parent_id
二、orcle

sql递归查询_第5张图片

 sql递归查询_第6张图片

三、mysql

delimiter $$ 
drop function if exists get_child_list$$ 
create function get_child_list(in_id varchar(10)) returns varchar(1000) 
begin 
 declare ids varchar(1000) default ''; 
 declare tempids varchar(1000); 
 
 set tempids = in_id; 
 while tempids is not null do 
  set ids = CONCAT_WS(',',ids,tempids); 
  select GROUP_CONCAT(id) into tempids from t_org_test where FIND_IN_SET(parent_id,tempids)>0;  
 end while; 
 return ids; 
end  
$$ 
delimiter ; 

 sql递归查询_第7张图片

你可能感兴趣的:(sql,数据库)