sql如何高效查询某树形节点下的所有叶子节点?
表结构
id node pid
with cte as ( select * from 表名 where pid=值 union all select a.* from 表名 as a,cte as b where a.pid=b.id ) select * from cte
你这个是读取树结构的吧,并不是查找叶子节点啊
@wongdavid: 就是这种方法,关键字叫做cte递归,你网上搜一下,一大把的
cte,你懂的~
如果要区分树干和树叶,建议设计数据表时就增加字段区分。
id:标识
node:节点名称
pid:父节点标识及id
例如:
id node pid
0 中国 -1
1 北京 0
2 海淀区 1
3 昌平区 1
如果你要查找北京这个节点下的所有区
你可以这样 select id,node,pid where pid=1
select * from [表名]
where pid in (select id from [表名])
类似这样的,一般我们都是这样设计数据库:id node pid code
code用于存储本节点的编码。节点编码=父节点编码+节点编码。
例如
父节点100,对应自己点100101,100102
父节点101,对应自己点101101,101102
然后就可以通过LIKE匹配查询了。
在建一个字段,存节点层级信息
存放数据如 1-2-5-19 ,其中 19 为当前节点的父节点,5为19的父节点,2为5的父节点,1为顶级节点。
这么设计的好处是:
1. 你可以根据任何一个父节点来找他下面所有的子节点及子节点下的子节点,like一下就出来了
2. 可以根据任何一个子节点来找他上级节点,上级的上级,直到顶级节点,只需根据这个字段拆分下就行而不需要做数据库查询。