Hierarchical Queries in SQL Server 2005

前端 未结 5 689
余生分开走
余生分开走 2020-11-29 07:43

Way back when I was working in an Oracle shop I took the CONNECT_BY for granted. Now I\'m stuck working with SQL Server 2005 and have some nasty object hierarchies. Specif

相关标签:
5条回答
  • 2020-11-29 08:09

    Just FYI. SQL Server 2008 supports a new data type Hierarchy ID.

    0 讨论(0)
  • 2020-11-29 08:18

    in SQL Server 2005 you can use Common Table Expressions (CTE) for this.

    0 讨论(0)
  • 2020-11-29 08:22

    Having used both, I found CONNECT BY is somewhat more flexible and easier to use than CTE's. The question is not dissimilar to one I answered a few weeks ago. See Here for a brief comparison of CONNECT BY and CTE's and Here for an example of a query using CTE's.

    0 讨论(0)
  • 2020-11-29 08:22

    To traverse the Depth of the Hierarchy first then the next sibling level, CTE can be used:

    declare @tempTable TABLE
    (
        ORGUID int,
        ORGNAME nvarchar(100), 
        PARENTORGUID int,
        ORGPATH nvarchar(max)
    )
    
    ;WITH RECORG(ORGuid, ORGNAME, PARENTORGUID, ORGPATH)
    as
    (
        select 
            org.UID,
            org.Name,
            org.ParentOrganizationUID,
            dbo.fGetOrganizationBreadcrumbs(org.UID)
        from Organization org
        where org.UID =1
    
        union all
    
        select 
            orgRec.UID,
            orgRec.Name,
            orgRec.ParentOrganizationUID,
            dbo.fGetOrganizationBreadcrumbs(orgRec.UID) 
        from Organization orgRec
        inner join RECORG recOrg on orgRec.ParentOrganizationUID = recOrg.ORGuid
    
    )
    insert into @tempTable(ORGUID, ORGNAME, PARENTORGUID,ORGPATH)
    
    select ORGUID, ORGNAME, PARENTORGUID,ORGPATH 
    from  RECORG rec 
    
    select * 
    from @tempTable where ORGUID in(select MIN(tt.ORGUID) 
                                    from @tempTable tt 
                                    group by tt.PARENTORGUID)
    
    0 讨论(0)
  • This creates your typical hierarchical table and uses a CTE to select the hierarchy structure and create a path for each item.

    CREATE TABLE tblHierarchy (ID int, ParentID int NULL, Name varchar(128));
    
    INSERT INTO tblHierarchy VALUES (1, NULL, '1');
    INSERT INTO tblHierarchy VALUES (2, NULL, '2');
    INSERT INTO tblHierarchy VALUES (3, NULL, '3');
    INSERT INTO tblHierarchy VALUES (4, 1, '1.1');
    INSERT INTO tblHierarchy VALUES (5, 1, '1.2');
    INSERT INTO tblHierarchy VALUES (6, 4, '1.1.1');
    
    WITH Parent AS
    (
        SELECT
            ID,
            ParentID,
            Name AS Path
        FROM
            tblHierarchy
        WHERE
            ParentID IS NULL
    
        UNION ALL
    
        SELECT
            TH.ID,
            TH.ParentID,
            CONVERT(varchar(128), Parent.Path + '/' + TH.Name) AS Path
        FROM
            tblHierarchy TH
        INNER JOIN
            Parent
        ON
            Parent.ID = TH.ParentID
    )
    SELECT * FROM Parent
    

    OUTPUT:

    ID  ParentID    Path
    1   NULL        1
    2   NULL        2
    3   NULL        3
    4   1       1/1.1
    5   1       1/1.2
    6   4       1/1.1/1.1.1
    
    0 讨论(0)
提交回复
热议问题