4 sql-server parents sql-server-2005 common-table-expression
我正在尝试使用SQL Server中的CTE但是已经达到了一个死胡同,让下面的场景工作.我有一个类似于这个的层次结构表:
Node(ID:439)
Node(ID:123)
Node(ID:900)
Node(ID:56)
Node(ID:900)
Run Code Online (Sandbox Code Playgroud)
预期成绩:
NodeID ParentNodeID
439 0
123 439
900 123
56 439
900 56
Run Code Online (Sandbox Code Playgroud)
所以基本上我们有一个父子层次表,有一个细微的区别.每个孩子可能有一个以上的父母.我已经研究了许多关于创建返回父子记录的CTE的博客文章和StackOverflow帖子,但是他们并没有返回孩子的所有父母,只是它找到的第一个父母.
这是我尝试的CTE示例:
WITH Hierarchy(NodeID, ParentNodeID)
AS
(
SELECT
T1.NodeID,
T1.ParentNodeID
FROM
ParentChildTable T1
WHERE
T1.NodeID = 439
UNION ALL
SELECT
T1.NodeID,
T1.ParentNodeID
FROM
Heirarchy T1
INNER JOIN Heirarchy TH ON TH.NodeID = T1.ParentNodeID
)
Run Code Online (Sandbox Code Playgroud)
(注意:出于隐私目的,上述CTE中的表和列的名称已从原始名称更改.)
上面的CTE工作正常,它找到从ID:439开始的所有父子记录,但它只找到一个父项目ID:900,即使它有两个父项.
如果有可能使用CTE,有人可以告诉我,还是有其他SQL方法可以做到这一点?
干杯.雅.
一旦我纠正了CTE中的语法错误,这对我来说似乎没问题:
create table #ParentChildTable
(nodeID int not null
,parentNodeID int not null
)
insert #ParentChildTable
select 900,56
union all select 900,123
union all select 123,439
union all select 56,439
union all select 439,0
;WITH Heirarchy
AS
(
SELECT
T1.NodeID,
T1.ParentNodeID
FROM
#ParentChildTable T1
WHERE
T1.NodeID = 439
UNION ALL
SELECT
T1.NodeID,
T1.ParentNodeID
FROM
#ParentChildTable T1
INNER JOIN Heirarchy TH ON TH.NodeID = T1.ParentNodeID
)
select *
from Heirarchy
Run Code Online (Sandbox Code Playgroud)
返回结果:
NodeID ParentNodeID
----------- ------------
439 0
123 439
56 439
900 56
900 123
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6664 次 |
| 最近记录: |