有一个表:Groups
它有三列:ID、NAME、PARENT
这将以以下方式流动。
- 假设有一个电子集团
- 在ELECTRONICS下,有MOBILE
- 在MOBILES下有三星
- 三星旗下有银河边缘
- 在GALAXY EDGE下有16GB和8GB
数据库中的数据如下所示:
ID NAME PARENT
1 ELECTRONICS null
2 MOBILE ELECTRONICS
3 SAMSUNG MOBILE
4 16GB SAMSUNG
5 8GB SAMSUNG
可能有N个层次。我想检索上一级的所有记录。在这种情况下,返回16GB和8GB。
解决此类问题的常用方法是递归查询。在Oracle中,这可以使用connect by
来完成。
但是:要从最后级别获取所有行,不需要递归查询。
这些都是未出现在parent
列中的行:
select *
from Groups
where name not in (select parent
from groups g2
where g2.parent is not null);
SQLFiddle:http://sqlfiddle.com/#!4/df70d/1
递归查询可用于查找某个类别下的所有节点,例如,如果您想查找三星以下的所有节点:
select *
from groups
start with name = 'SAMSUNG'
connect by prior name = parent;