首页 > 解决方案 > 如何在sql / oracle中选择节点的所有子节点和父节点

问题描述

我有一张如下表

我的表

| ID     |  PARENT_ID |
-----------------------------
|   20      | null      |
|   40     | null      |
|   50     | null      |
|   70     | 122       |
|   100    | 40        |
|   102    | 4         |
|   126    | 100       |
|   9     | 50         |
|   122    | 40        |
|   123    | 9         | 

我想为给定的三个孩子 126 ,70 和 123 选择包括所有孩子和父母的层次结构树,如下所示

预期产出

| ID     |  PARENT_ID |
-----------------------------
|   126     | 100      |
|   100     | 40       |
|   40      | null     |
|   70      | 122      |
|   122     | 40       |
|   123     | 9        |
|   9       | 50       |
|   50      | null     |

我试过了

select ID, PARENT_ID
from MyTable
start with ID=126 //this for example 
connect by prior ID=Parent;

标签: sqloraclehierarchical-datarecursive-queryconnect-by

解决方案


您可以使用CONNECT BY PRIOR子句通过分层查询来做到这一点:

select * from MyTable start with id in (126,70,123)
         connect by prior parent_id = id;

注意:由于您有两个节点parent_id = 40,因此您将获得两行 40 asID和 null as parent_id。如果只想保留一行,请使用distinct子句:

select distinct * from MyTable start with id in (126,70,123)
         connect by prior parent_id = id;

推荐阅读