【问题标题】:How can I trace ID/ParentID relationships among table rows?如何跟踪表行之间的 ID/ParentID 关系?
【发布时间】:2011-02-12 19:56:45
【问题描述】:

我有一个像 records(ID, ParentID) 这样的表格,其中包含这些数据:

ID   ParentID  
1    null  
2    1  
3    2   
4    2  
5    3  
6    null  
7    6  

如果将这张表绘制成一个家族的层次结构,1,2,3,4,5 将相互关联。

我想找到一种方法来传递一个 ID(如 3),以便它给我其他家庭成员。我正在使用 C# 和 SQL,两者都可以 - 我想找到这样的结果:

3 - result 1,2,4,5
2 - result 1,3,4,5
6 - result 7
and so on

我想找到我传入的 ID 的父母、祖父母、孩子和孙子女(如我的示例中)。

【问题讨论】:

  • 实际数据有多深? CTE 可以完成这项工作......不过,当我不得不这样做时,我刚刚手动创建了一个节点树(作为表),允许我通过 BETWEEN 进行查询
  • 数据的深度可能是3级或4级
  • 您有两行 ID=3 吗?那么我假设 ID 不是唯一的或识别的吗?
  • 测试数据是否代表整个数据集?例如,可能有一些 ID 存在于 ParentID 中但不存在于 ID 中(例如 5)。此外,ID 2 的测试用例与您要查找的内容的描述不匹配。 ID 2 有父 1 和子 3,但 3 没有子,所以根据描述的结果应该只是 1,3,不是吗?
  • 对不起“Daniel Renshaw”,我编辑了我的问题,你是对的,现在我希望它变得清晰

标签: c# sql sql-server stored-procedures function


【解决方案1】:

应该这样做。

CREATE TABLE #Test
(
    ID int,
    ParentID int
)

INSERT #Test VALUES (1, null)
INSERT #Test VALUES (2, 1)
INSERT #Test VALUES (3, 2)
INSERT #Test VALUES (4, 2)
INSERT #Test VALUES (5, 3)
INSERT #Test VALUES (6, null)
INSERT #Test VALUES (7, 6)

DECLARE @QueryId int
SET @QueryId = 2

-- My parents
SELECT [ParentID] FROM #Test WHERE [ID] = @QueryID AND [ParentID] IS NOT NULL
UNION -- My parent's parents
SELECT [ParentID] FROM #Test WHERE [ID] IN (SELECT [ParentID] FROM #Test WHERE [ID] = @QueryID) AND [ParentID] IS NOT NULL
UNION -- My parent's children (i.e. my siblings), excluding me
SELECT [ID] FROM #Test WHERE [ParentID] IN (SELECT [ParentID] FROM #Test WHERE [ID] = @QueryID) AND [ID] != @QueryID
UNION -- My chidren
SELECT [ID] FROM #Test WHERE [ParentID] = @QueryId
UNION -- My chidren's children
SELECT [ID] FROM #Test WHERE [ParentID] IN (SELECT [ID] FROM #Test WHERE [ParentID] = @QueryId)

DROP TABLE #Test

【讨论】:

  • 另一个很好的解决方案,但它只适用于 2 个级别,如果你设置 @QueryId = 5 ,结果是 2,3 应该是 1,2,3,4 为 1,2,3在 myParents 的树中,4 来自我的一位父母,无论如何,非常感谢你,感谢所有成员,我从你们每个人那里获取我需要的信息。
【解决方案2】:

您可能想看看看起来很适合您的问题的Hierarchy 类型。虽然这仅适用于 SQL Server 2008

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多