1.网上的做法:
递归查询貌似只是oracle单独提供出来的。其他数据库没有提供递推查询吧。。。。
我当时做的项目是通过一个公司查出所有的子公司和子公司的子公司。。。
我做第一个项目的时候就是用的start with connect by prior做的。没找到其他递归方法。。
第二个项目的时候,这种树形结构有可能无限层,这个时候start with connect by prior也就不可靠了,速度慢。如果这个表可以新增一个字段,建议你加一个字段,当时我取名叫nodeIds,varchar类型的,用来存放父类的nodeIds+自己的id。
比如说顶层部门的id为1,那么该部门的nodeIds就是,1,,然后他下一层部门id是2,则这个部门的nodeIds的值就是,1,2,....id是2的部门的下一层部门id为3的话,则这个部门的nodeIds的值就是,1,2,3,,这样的话,你就完全好查询的。。。通过传入id所对应的部门的nodeIds去like一下,就获得了他及其所有子部门。
比如你要查id是1的所有子部门,那么你就拿,1,去数据库like一下,那么,1, ,1,2, ,1,2,3, 都拿出来了。。。后面两个肯定是前面那个的子部门。。。
如果层数过多,这个应该算是一种较优的算法了,我反正还没见过比这个好的解决大量层递归查询的方法。这个方法当然也不是我想出来的,我还没那么大本事。这个算法在10亿条数据之内绝对不可能慢的。因为我一个朋友是在一个数据量相当庞大的公司工作的(这个公司我不方便透露),这个想法就是从他那里借鉴的,他们都是采用新增一个字段代替递归查询。
2.HOLA系统做法:
定义lft 和 rgt 左右节点, 子类的lft属性永远大于父类的lft,相反子类的rgt 属性永远小于父类的rgt。
select * from folders f where f.record_flag=''01'' and 子类.lft > 父类.lft and 子类.rgt <父类.rgt;