【问题标题】:T-SQL :Parent-Child Hierarchy - based on @VariableT-SQL :Parent-Child Hierarchy - 基于@Variable
【发布时间】:2013-04-19 20:57:23
【问题描述】:
DECLARE @Categories TABLE (
        CategoryID INT, 
        CategoryName VARCHAR(20),
        ParentID INT )


        INSERT INTO @Categories(CategoryID, CategoryName, ParentID)
            SELECT 1, 'Company', NULL UNION ALL
            SELECT 2, 'Dept A', 1 UNION ALL
            SELECT 3, 'Dept B', 1 UNION ALL
            SELECT 4, 'DA_Sub_1', 2 UNION ALL
            SELECT 5, 'DA_Sub_2', 2 UNION ALL
            SELECT 6, 'DA_Sub_3', 2 UNION ALL
            SELECT 7, 'DA_Sub_4', 2 UNION ALL
            SELECT 8, 'DA1_I', 4 UNION ALL
            SELECT 9, 'DA1_II', 4
        DECLARE @ID int = 4
        DECLARE @Matched int = (SELECT CASE WHEN ParentID = 0 THEN CategoryID ELSE ParentID END FROM @Categories WHERE CategoryID = @ID)

        ;WITH cte AS (
            SELECT CategoryID, CategoryName, ParentID
            FROM @Categories WHERE ParentID IS NULL
            UNION ALL
            SELECT c.CategoryID, c.CategoryName, c.ParentID
            FROM @Categories c
            INNER JOIN cte p ON p.CategoryID = c.ParentID

    )

输出

CID CName           PID
1   Company         NULL
2   Dept A          1
3   Dept B          1
4   DA_Sub_1        2
5   DA_Sub_2        2
6   DA_Sub_3        2
7   DA_Sub_4        2
8   DA1_I           4
9   DA1_II          4

我想这样,我可以传递一个变量,它会

1) list Self + Parents
2) list Self + Siblings
3) list Self + Children
4) list Parents
5) list Siblings
6) list children
7) list Parents + Self + Siblings.
8) list self + siblings + children
9) list Parents + Self + Siblings + Children (if any).

我怎样才能实现这些目标? (这是我自己的知识,因为我正在尝试了解层次结构在 t-sql 中的工作方式)。

谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql common-table-expression


    【解决方案1】:

    为了得到孩子:

    SELECT * FROM @Categories WHERE ParentId = @Id
    

    获取条目本身:

    SELECT * FROM @Categories WHERE CategoryId = @Id
    

    获取父级:

    SELECT parent.*
      FROM @Categories parent
      JOIN @Categories self
        ON self.ParentId = parent.CategoryId
     WHERE self.CategoryId = @Id
    

    获取兄弟姐妹:

    SELECT siblings.*
      FROM @Categories parent
      JOIN @Categories self
        ON self.ParentId = parent.CategoryId
      JOIN @Categories siblings
        ON siblings.ParentId = parent.CategoryId
     WHERE self.CategoryId = @Id
    

    获得组合结果的最简单方法是像这样使用UNION ALL

    SELECT * FROM @Categories WHERE ParentId = @Id
    
    UNION ALL
    
    SELECT * FROM @Categories WHERE CategoryId = @Id
    
    UNION ALL
    
    SELECT parent.*
      FROM @Categories parent
      JOIN @Categories self
        ON self.ParentId = parent.CategoryId
     WHERE self.CategoryId = @Id
    
    UNION ALL
    
    SELECT siblings.*
      FROM @Categories parent
      JOIN @Categories self
        ON self.ParentId = parent.CategoryId
      JOIN @Categories siblings
        ON siblings.ParentId = parent.CategoryId
     WHERE self.CategoryId = @Id
    

    您还可以添加 HIERARCHYID 列:http://msdn.microsoft.com/en-us/library/bb677290.aspx 这将使查询占用的资源少一些,但需要在表中增加一列。

    【讨论】:

    • 嗯...有趣..我会调查 HIERARCHYID。似乎很有用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2018-03-12
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多