我有一张如下表
id name dependency
-----------------------
1 xxxx 0
2 yyyy 1
3 zzzz 2
4 aaaaaa 0
5 bbbbbb 4
6 cccccc 5
名单还在继续。我想从这个表中选择一组行,方法是在 SQL 的 where 子句中给出 0 依赖项的名称,直到它达到没有更多依赖项的条件。 (例如,第 1,2,3 行形成一个组,第 4,5,6 行是另一个组)。请帮助
最佳答案
由于您没有指定产品,我将使用 SQL 规范中可用的功能。在这种情况下,我使用了许多数据库产品支持的公用表表达式,包括 SQL Server 2005+ 和 Oracle(但不包括 MySQL):
With MyDependents As
(
Select id, name, 0 As level
From MyTable
Where dependency = 0
And name = 'some value'
Union All
Select T.id, T.name, T.Level + 1
From MyDependents As D
Join MyTable As T
On T.id = D.dependency
)
Select id, name, level
From MyDependents
另一个不依赖于公用表表达式但确实假设最大深度级别(在这种情况下低于 0 级的两个级别)的解决方案将类似于
Select T1.id, T1.name, 0 As level
From MyTable As T1
Where T1.name = 'some value'
Union All
Select T2.id, T2.name, 1
From MyTable As T1
Join MyTable As T2
On T2.Id = T1.Dependency
Where T1.name = 'some value'
Union All
Select T3.id, T3.name, 2
From MyTable As T1
Join MyTable As T2
On T2.Id = T1.Dependency
Join MyTable As T3
On T3.Id = T2.Dependency
Where T1.name = 'some value'
关于SQL 嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5711561/