복붙노트

[SQL] SQL Server 2005의 계층 적 쿼리

SQL

SQL Server 2005의 계층 적 쿼리

당연한 내가 오라클에서 일하는 웨이 다시 내가 CONNECT_BY했다 가게. 지금은 SQL 서버 2005 붙어 작업을하고있어 성가신 객체 계층 구조를 가지고있다. 모든 자식 레코드가 부모의 ID와 열이 어디 특히, 우리는 자기 참조 테이블이 있습니다. 현재 우리는 계층과 자녀와 연결 부모에게 무거운 짐을을하는 불쾌한 쿼리의 수준에 아이를 매핑하는 볼 수 있습니다. 이 방법은 작동하지만, 그것은 멀리 우아한에서하고 더러운의 냄새. 나는 다른 사람들이 SQL 서버 2005에서 계층 적 데이터를 검색하는 방법 그냥 궁금 해요.

해결법

  1. ==============================

    1.이것은 당신의 전형적인 계층 테이블을 생성하고 계층 구조를 선택하고 각 항목에 대한 경로를 생성하기 위해 CTE를 사용합니다.

    이것은 당신의 전형적인 계층 테이블을 생성하고 계층 구조를 선택하고 각 항목에 대한 경로를 생성하기 위해 CTE를 사용합니다.

    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
    

    산출:

    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
    
  2. ==============================

    2.둘 다 사용하는 데, 나는 CONNECT BY는 CTE의보다 사용하기 좀 더 유연하고 쉽게 발견했다. 하나 나는 몇 주 전에 대답에 질문은 비슷하지 않다. CTE의를 사용하여 쿼리의 예를 들어 CONNECT BY와 CTE의와 다음의 간단한 비교를 보려면 여기를 참조하십시오.

    둘 다 사용하는 데, 나는 CONNECT BY는 CTE의보다 사용하기 좀 더 유연하고 쉽게 발견했다. 하나 나는 몇 주 전에 대답에 질문은 비슷하지 않다. CTE의를 사용하여 쿼리의 예를 들어 CONNECT BY와 CTE의와 다음의 간단한 비교를 보려면 여기를 참조하십시오.

  3. ==============================

    3.그냥 참고하시기 바랍니다. SQL Server 2008을 지원하는 새로운 데이터 형식 계층 ID.

    그냥 참고하시기 바랍니다. SQL Server 2008을 지원하는 새로운 데이터 형식 계층 ID.

  4. ==============================

    4.이 읽기 :

    이 읽기 :

    http://www.sitepoint.com/article/hierarchical-data-database/2/

    그것은 당신에게 몇 가지 아이디어를 제공해야합니다 ...

  5. ==============================

    5.SQL Server 2005에서이 공통 테이블 식 (CTE)를 사용할 수 있습니다.

    SQL Server 2005에서이 공통 테이블 식 (CTE)를 사용할 수 있습니다.

  6. ==============================

    6.다음 형제 레벨을 먼저 계층 구조의 깊이를 탐색하기 위해, CTE를 사용할 수 있습니다 :

    다음 형제 레벨을 먼저 계층 구조의 깊이를 탐색하기 위해, CTE를 사용할 수 있습니다 :

    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)
    
  7. from https://stackoverflow.com/questions/235515/hierarchical-queries-in-sql-server-2005 by cc-by-sa and MIT license