【问题标题】:SQL Server - Get all children of a row in many-to-many relationship?SQL Server - 以多对多关系获取一行的所有子项?
【发布时间】:2017-10-05 23:38:22
【问题描述】:

我正在尝试在 SQL Server 中编写一个递归查询,该查询基本上列出了给定父级的父子层次结构。一个父母可以有多个孩子,一个孩子可以属于多个父母,因此它以多对多的关系存储。

我从另一个有点相关的问题修改了以下查询,但这并没有一直到树,只选择第一级子...

DECLARE @ObjectId uniqueidentifier
SET @ObjectId = '1A213431-F83D-49E3-B5E2-42AA6EB419F1';

WITH Tree AS
(
   SELECT A.*
   FROM Objects_In_Objects A
   WHERE A.ParentObjectId = @ObjectId

   UNION ALL

   SELECT B.*
   FROM Tree A
   JOIN Objects_In_Objects B
   ON A.ParentObjectId = B.ObjectId
)
SELECT *
FROM Tree
INNER JOIN Objects ar on tree.ObjectId = ar.ObjectId

有谁知道如何修改查询以一直沿“树”向下移动?或者使用上面的结构是不可能的?

对象

列:ObjectId | Name

Objects_In_Objects

列:ObjectId | ParentObjectId

样本数据:

对象

ObjectId                             | Name
1A213431-F83D-49E3-B5E2-42AA6EB419F1 | Main container  
63BD908B-54B7-4D62-BE13-B888277B7365 | Sub container  
71526E15-F713-4F03-B707-3F5529D6B25E | Sub container 2  
ADA9A487-7256-46AD-8574-0CE9475315E4 | Object in multiple containers

对象中的对象

ObjectId                             | ParentObjectId                    
ADA9A487-7256-46AD-8574-0CE9475315E4 | 71526E15-F713-4F03-B707-3F5529D6B25E
ADA9A487-7256-46AD-8574-0CE9475315E4 | 63BD908B-54B7-4D62-BE13-B888277B7365
63BD908B-54B7-4D62-BE13-B888277B7365 | 1A213431-F83D-49E3-B5E2-42AA6EB419F1
71526E15-F713-4F03-B707-3F5529D6B25E | 1A213431-F83D-49E3-B5E2-42AA6EB419F1

【问题讨论】:

    标签: sql sql-server many-to-many hierarchical-data


    【解决方案1】:

    这样的递归 CTE(公用表表达式)一路

    试试这个:

    ;WITH Tree AS
    (
       SELECT A.ObjectID, A.ObjectName, o.ParentObjectID, 1 AS 'Level'
       FROM dbo.Objects A
       INNER JOIN dbo.Objects_In_Objects o ON A.ObjectID = o.ParentObjectID
       WHERE A.ObjectId = @ObjectId           -- use the A.ObjectId here
    
       UNION ALL
    
       SELECT A2.ObjectID, A2.ObjectName, B.ParentObjectID, t.Level + 1 AS 'Level'
       FROM Tree t 
       INNER JOIN dbo.Objects_In_Objects B ON B.ParentObjectID = t.ObjectID
       INNER JOIN dbo.Objects A2 ON A2.ObjectId = B.ObjectId        
    )
    SELECT *
    FROM Tree
    INNER JOIN dbo.Objects ar on tree.ObjectId = ar.ObjectId
    

    如果您更改此设置 - 现在是否适合您? (我添加了一个Level 列 - 通常有助于理解每一行的层次结构中的“深度”)

    我似乎确实在我的 SQL Server 实例上得到了正确的输出,至少……

    【讨论】:

    • 不,实际上这根本没有结果:)
    • @ReFocus:更新了我的回复,我在你的各种表格中搞混了 :-) 试过这个 - 似乎产生了我期望的输出......
    【解决方案2】:
    declare @Objects_In_Objects table
    (
      ObjectID uniqueidentifier, 
      ParentObjectId uniqueidentifier
    )
    
    declare @Objects table
    (
      ObjectId uniqueidentifier, 
      Name varchar(50)
    )
    
    insert into @Objects values
    ('1A213431-F83D-49E3-B5E2-42AA6EB419F1', 'Main container'),  
    ('63BD908B-54B7-4D62-BE13-B888277B7365', 'Sub container'),  
    ('71526E15-F713-4F03-B707-3F5529D6B25E', 'Sub container 2'),  
    ('ADA9A487-7256-46AD-8574-0CE9475315E4', 'Object in multiple containers')
    
    insert into @Objects_In_Objects values
    ('ADA9A487-7256-46AD-8574-0CE9475315E4', '71526E15-F713-4F03-B707-3F5529D6B25E'),
    ('ADA9A487-7256-46AD-8574-0CE9475315E4', '63BD908B-54B7-4D62-BE13-B888277B7365'),
    ('63BD908B-54B7-4D62-BE13-B888277B7365', '1A213431-F83D-49E3-B5E2-42AA6EB419F1'),
    ('71526E15-F713-4F03-B707-3F5529D6B25E', '1A213431-F83D-49E3-B5E2-42AA6EB419F1')
    
    
    DECLARE @ObjectId uniqueidentifier
    SET @ObjectId = '1A213431-F83D-49E3-B5E2-42AA6EB419F1';
    
    WITH Tree AS
    (
       SELECT A.ObjectID,
              A.ParentObjectId
       FROM @Objects_In_Objects A
       WHERE A.ParentObjectId = @ObjectId
    
       UNION ALL
    
       SELECT B.ObjectID,
              B.ParentObjectId
       FROM Tree A
       JOIN @Objects_In_Objects B
       ON B.ParentObjectId = A.ObjectId
    )
    SELECT *
    FROM Tree
    INNER JOIN @Objects ar on tree.ObjectId = ar.ObjectId;
    

    这就是你要找的吗? https://data.stackexchange.com/stackoverflow/q/111357/

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 这是与我的情况不同的情况。评论属于单个实体,而在我的情况下,评论可能属于多个实体。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 2013-02-10
      • 2021-03-23
      相关资源
      最近更新 更多