我有2张桌子. items和itemItems
itemItems描述了多对多之间的关系items.即一个成员items可以有很多孩子,他们可以有很多孩子,反过来可以有很多孩子等.
项目:
itemID | more stuff ......
1 ...
2 ...
3 ...
4 ...
Run Code Online (Sandbox Code Playgroud)
itemItems:
parentItemID | childItemID
1 2
1 3
2 4
Run Code Online (Sandbox Code Playgroud)
我想编写一个查询,以递归方式获取一个根节点下的所有子节点.
我相信这可以用一种称为递归连接的东西,但我发现这个概念非常令人困惑....(类似于这个问题,但是sqlite不是sql server而且很多都不是一对多)
通过执行以下操作,我可以获得第一级(即一个项目下的所有子项)
SELECT *
FROM items
INNER JOIN itemItems
ON items.itemID = itemItems.childItemID
WHERE itemItems.parentItemID = 1
Run Code Online (Sandbox Code Playgroud)
我怎么能延长这个以递归方式获得所有孩子的孩子等...?
我在Sql Server中有这个查询,我需要在EntityFramework中使用,那么如何编写一个与此结果相同的EntityFramwork代码
WITH cte AS
(
SELECT *
FROM StockGroups
WHERE GroupParent ='Stationery'
UNION ALL
SELECT g.*
FROM StockGroups g
JOIN cte
ON g.GroupParent = cte.GroupName
)
SELECT *
FROM cte
Run Code Online (Sandbox Code Playgroud)
我不知道如何在EF中转换它,所以我尝试使用join.
from a in db.StockGroups
join b in db.StockGroups on new { GroupParent = a.GroupParent } equals new { GroupParent = b.GroupName }
where
b.GroupName == "Stationery"
select new {
a.GroupName,
a.GroupParent,
Column1 = b.GroupName,
Column2 = b.GroupParent
}
Run Code Online (Sandbox Code Playgroud)
但结果并不像CTE一样递归.
我有下表:
Account_Number Parent_Account Child_Account
R003247 R000355 R000002
R000355 NULL R003247
R000002 R003247 NULL
R004853 NULL R028636
R004853 NULL R028638
R004853 NULL R028637
R028636 R004853 NULL
R028638 R004853 NULL
R028637 R004853 NULL
Run Code Online (Sandbox Code Playgroud)
可以加载:
create table dbo.temptable
(Account_Number varchar(10),
Parent_Account varchar(10),
Child_Account varchar(10))
insert into dbo.temptable
values
('R003247','R000355','R000002'),
('R000355',NULL,'R003247'),
('R000002','R003247',NULL),
('R004853',NULL,'R028636'),
('R004853',NULL,'R028638'),
('R004853',NULL,'R028637'),
('R028636','R004853',NULL),
('R028638','R004853',NULL),
('R028637','R004853',NULL)
Run Code Online (Sandbox Code Playgroud)
此表表示帐号的拆分和重新分配。它与跟踪地块的分割和组合有关。
前三行,如上表所示,应该组合在一起,因为它来自R000355--> R003247-->R000002
如上表所示,最后 6 个也应分组,因为它显示R004853分为三个R028636, R028637, R028638。
我已经尝试了很多这样的变化:
SELECT CE.*,TT.ID
FROM dbo.temptable CE
INNER JOIN …Run Code Online (Sandbox Code Playgroud) 我在SQL Server中有此表:
Parent Child
1 2
89 7
2 3
10 5
3 4
我需要构建一个递归存储过程,以找到任何孩子的最大升序。
例如:如果我想找到最大上升数4,它应该返回1,因为:
4是3的孩子。
3是2的孩子。
2是1的子代。
所以我可以找到最终的父母。