Sql Select语句以获取列表中的树状结构
我有一个包含以下条目的sql表: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#中执行以下查询来实现类似的功能: (至少可以
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
)