Sql Select语句以获取列表中的树状结构

Sql Select语句以获取列表中的树状结构,sql,oracle,Sql,Oracle,我有一个包含以下条目的sql表: ID, Name, ParentID 1, A, null 2, B, null 3, C, 1 4, D, null 5, E, 1 我想得到一个按名称排序的列表,但是sub应该在父级之后 Expected result: A, C, E, B, D 如何使用SQL查询解决此问题?parentID上的groupby不能解决问题,因为当时我得到(C,E),(A,B,D)我曾经能够通过在C#中执行以下查询来实现类似的功能: (至少可以

我有一个包含以下条目的sql表:

ID, Name, ParentID   
1,  A,  null
2,  B,  null
3,  C,  1
4,  D,  null
5,  E,  1
我想得到一个按名称排序的列表,但是sub应该在父级之后

Expected result: A, C, E, B, D

如何使用SQL查询解决此问题?parentID上的groupby不能解决问题,因为当时我得到(C,E),(A,B,D)

我曾经能够通过在C#中执行以下查询来实现类似的功能: (至少可以在SQL server中使用)


如果您只有一个级别的父级/子级,您可以简单地使用:

SELECT  NVL(ParentID, ID) AS ParentID,  
        LISTAGG(Name, ', ') WITHIN GROUP (ORDER BY ID) AS Members
FROM    T
GROUP BY NVL(ParentID, ID);
这使得:

PARENTID    MEMBERS
---------------------
1           A, C, E
2           B
4           D

否则,您将需要使用递归来获取每个成员的基本ID(即,如果您有parentID=5的第6个实体):

其中:

ID  MEMBERS
1   A, C, E, F
2   B
4   D
对于第一个查询,结果将是:

ID  MEMBERS
1   A, C, E
2   B
4   D
5   F

对于Oracle,此变体适用于:

select 
  listagg(Name, ',') 
    within group (order by rn)         -- Collect values as arranged
                                       -- in previous query 
from (
  select
    rownum rn,                         -- Collect order of rows 
    Name
  from t
  start with ParentID is null
  connect by prior ID = ParentID       -- Get hierarchy by ParentID
  order siblings by Name               -- Arrange nodes on each level by Name   
)

您正在使用哪些RDBMS?SQL Server、MySQL、Oracle、MSAccess?Oracle和我也在使用LINQ。这通常通过递归查询来解决,在SQL Server中称为CTE(公共表表达式)。我不知道甲骨文的等价物。会有多少层?如果你还有6-F-5,7-G-3,你能告诉我你的预期产量吗?(即F child到e和G child到C,两者都是A下的根)。。。
ID  MEMBERS
1   A, C, E
2   B
4   D
5   F
select 
  listagg(Name, ',') 
    within group (order by rn)         -- Collect values as arranged
                                       -- in previous query 
from (
  select
    rownum rn,                         -- Collect order of rows 
    Name
  from t
  start with ParentID is null
  connect by prior ID = ParentID       -- Get hierarchy by ParentID
  order siblings by Name               -- Arrange nodes on each level by Name   
)