以递归方式从表中获取值

Posted

技术标签:

【中文标题】以递归方式从表中获取值【英文标题】:GET Values from table in a recursive manner 【发布时间】:2013-11-09 14:54:43 【问题描述】:

我正在尝试使用 LINQ,但我被困在这里。我的问题是我想检索特定一侧的所有用户的计数。让我解释。这是我的带有示例数据的表格快照。

ID 名称 SponsorID PairSide 1001 用户 1 1000 左 1002 用户 2 1001 左 1003 用户 3 1001 权利 1004 用户 4 1001 权利 1005 用户 5 1004 左 1006 用户 6 1004 权利 1007 用户 7 1002 左 1008 用户 8 1002 左 1009 用户 9 1003 权利 1010 用户 10 1001 右

现在数据就像.. User1 有 4 个孩子,左侧有 1 个,右侧有 3 个,User2 左侧有两个孩子,依此类推。 由于 user2 是 User1 的孩子,所以 User2 的孩子也将成为 User1 的孩子。所以根据上面的数据,User1左边一共有4个孩子,右边有5个孩子。如有错误请见谅。但我想要一些 linq 或 sql 代码来计算这些东西

    特定 ID 左侧的用户总数 特定 ID 权限的用户总数 枚举子用户,以便我可以使用它来显示树

这是虚拟数据,我的实际网站将包含至少 20,000 个数据,我必须在那里进行计算。请为此提供逻辑。

【问题讨论】:

请提供给我... Stack Overflow 的规则是:先试后问。使用 LINQ 进行递归查询是 Stack Overflow 上反复出现的问题。如果您寻找递归(或分层)查询 + LINQ,您会找到很多答案。好吧,实际上,缺少答案是因为 LINQ + recursive 不适合。此外,当您标记 [linq] 时,假定您的目标是 linq-to-objects,而您显然没有这样做。了解 LINQ 的类型始终很重要。与您的目标数据库一样。 【参考方案1】:

试试下面的代码

Declare @table table (ID int, Name varchar(20), SponsorID int, PairSide varchar(10) ) insert into @table(ID,Name,SponsorID,PairSide) values(1001, 'User1', 1000 ,'Left'), (1002, 'User2', 1001, 'Left'), (1003, 'User3' ,1001 ,'Right'), (1004, 'User4' ,1001, 'Right'), (1005, 'User5' ,1004 ,'Left'), (1006, 'User6' ,1004 ,'Right'), (1007, 'User7' ,1002 ,'Left'), (1008, 'User8' ,1002 ,'Left'), (1009, 'User9' ,1003 ,'Right'), (1010, 'User10', 1001, 'Right') Select Sponsorid, Count(SponsorID) TotalChild , Count((Case when PairSide = 'Left' Then 1 end)) LeftChild , Count((Case when PairSide = 'Right' Then 1 end)) RightChild from @table Group by SponsorID

【讨论】:

这很好,但它只给出一个级别的输出,即 1001 的孩子或 1002 的孩子。我也想获得 1001 的子孩子,即 1002 的孩子,因为 1002 是 1001 的孩子

以上是关于以递归方式从表中获取值的主要内容,如果未能解决你的问题,请参考以下文章

如何从表中选择数据以转置或交叉表方式输出?

使用模型内的query()方法从表中获取单个值

这样可以从相关表中获取值名称

选择查询以从表中查找重复值 [重复]

如何以原子方式删除和获取行数据? [关闭]

SQL 从表中获取值