数据库查询父分类与子分类

首先创建数据表tmpCity,结构与数据如下(id标识,title名称,parentID父级id,leaves几级分类):

数据库查询父分类与子分类_第1张图片


oracle 根据id,查询其上下级的所有组织:

--查询下级的所有区域
select * from tmpCity A where id<>1 start with A.id=1 connect by prior A.ID = A.Parentid
--查询上级的所有区域
select * from tmpCity A start with A.id=13 connect by prior A.Parentid=A.Id;


sqlServer (2005以后)根据id,查询其上下级的所有组织:

--查询下级的所有区域
with cte_child(ID,ParentID,Title,levels)
as
(
    --起始条件
    select ID,ParentID,Title,levels from tmpCity where id = '1' --列出父节点查询条件
    union all
    --递归条件
    select a.ID,a.ParentID,a.title,a.levels from tmpCity a
    inner join 
    cte_child b
    on ( a.ParentID=b.ID)  --根据查询到的父节点(a.Parent),通过CTE递归查询出其子节点(b.ID)
)
select * from cte_child;

--查询树状结构某节点的上级所有根节点。
with cte_root(ID,ParentID,title,levels)
as
(
    --起始条件
    select ID,ParentID,title,levels from tmpCity where id = '13'   --列出子节点查询条件
    union all
    --递归条件
    select a.ID,a.ParentID,a.title,a.levels from tmpCity a
    inner join 
    cte_root b          
    on a.ID=b.ParentID  --根据基础表条件查询子节点(a.ID),通过CTE递归找到其父节点(b.ParentID)。
)                       
select * from cte_root ;

MySql根据id,查询其上下级的所有组织:

mysql没有递归函数,需自己创建一个

CREATE FUNCTION getChildList(rootId INT) #rootId为你要查询的节点。
 RETURNS VARCHAR(1000)  
 BEGIN 
	 DECLARE pTemp VARCHAR(1000);  
	 DECLARE cTemp VARCHAR(1000);  #两个临时变量
	
	 SET pTemp = '$';  
	 SET cTemp =cast(rootId as CHAR);  #把rootId强制转换为字符。
	
	 WHILE cTemp is not null DO  
		 SET pTemp = concat(pTemp,',',cTemp);  #把所有节点连接成字符串。
		 SELECT group_concat(id) INTO cTemp FROM tmpcity   
		 WHERE FIND_IN_SET(parentId,cTemp)>0;
	 END WHILE;  
	 RETURN pTemp; 
 END
select * from tmpcity where FIND_IN_SET(id,getChildList(1))






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