SQL Server 2014에서 계층 적 데이터를 표시하는 방법

사시 부산

두 개의 테이블 CompanyCompanyRelationShip.

DECLARE @Company TABLE (
    CompanyId INT
    ,RootCompanyId INT
    ,CompanyName VARCHAR(100)
    )

INSERT INTO @Company
VALUES (2,2,'ROOT')
,(106,2,'ABC')
,(105,2,'CDF')
,(3,3,'ROOT2')
,(150,3,'YXZ')
,(151,3,'XZX')


DECLARE @CompanyRelationShip TABLE (
    PrimaryCompanyId INT
    ,CompanyId INT
    )

INSERT INTO @CompanyRelationShip
VALUES (2,2)
,(2,106)
,(2,105)
,(106,105)
,(3,3)
,(3,151)
,(3,150)
,(151,150)

결과를 아래 형식으로 원합니다.

CompanyId   PrimayCompanyId PrimaryCompanyName  RootCompanyId   RootCompanyName
2                 2              ROOT               2               ROOT
106               2              ROOT               2               ROOT
105              106             ABC                2               ROOT
3                 3              ROOT2              3               ROOT2
151              3               ROOT2              3               ROOT2
150              151             XZX                3               ROOT2

결과를 얻기 위해 아래 쿼리를 시도했습니다.

WITH PrimayCompany
AS (
    SELECT CR.PrimaryCompanyId
        ,C.CompanyName
    FROM @CompanyRelationShip CR
    JOIN @Company C ON CR.CompanyId = CR.PrimaryCompanyId
    )
    ,RootCompany
AS (
    SELECT RootCompanyId
        ,CompanyName
    FROM @Company
    WHERE CompanyId = RootCompanyId
    )
SELECT C.CompanyId
    ,C.RootCompanyId
    ,RC.CompanyName
    ,CR.PrimaryCompanyId
    ,PC.CompanyName
FROM @Company C
LEFT JOIN @CompanyRelationShip CR ON C.CompanyId = CR.PrimaryCompanyId
LEFT JOIN PrimayCompany PC ON PC.PrimaryCompanyId = CR.PrimaryCompanyId
LEFT JOIN RootCompany RC ON RC.RootCompanyId = CR.PrimaryCompanyId

정말 도움을 주시면 감사하겠습니다.

Shnugo

내 의견에서 나는 왜 테이블이 필요한지 물었다 @CompanyRelationShip. 이것은 단지 엄청난 복잡성과 오류 가능성을 추가하는 것입니다.

내 제안은 첫 번째 테이블에만 의존합니다. 계층 구조 아래배치하기 위해 105 및 151의 상위 ID를 어떻게 변경했는지보십시오 . 원칙을 보여주기 위해 150 미만 의 두 번째 자녀를 추가했습니다 .

DECLARE @Company TABLE (
    CompanyId INT
    ,RootCompanyId INT
    ,CompanyName VARCHAR(100)
    );

INSERT INTO @Company
VALUES (2,2,'ROOT')
,(106,2,'ABC')
,(105,106,'CDF')
,(3,3,'ROOT2')
,(150,3,'YXZ')
,(151,150,'XZX')
,(152,150,'Second below 150');

-쿼리

WITH recCTE AS
(
    SELECT CompanyId AS [RootId],CompanyName AS [RootName],*,1 AS HierarchyLevel FROM @Company WHERE CompanyId=RootCompanyId
    UNION ALL
    SELECT rc.RootId,rc.RootName,c.*,rc.HierarchyLevel+1
    FROM @Company c
    INNER JOIN recCTE rc ON c.RootCompanyId=rc.CompanyId AND c.CompanyId<>rc.CompanyId
)
SELECT RootId
      ,RootName
      ,RootCompanyId AS [PrevId]
      ,CompanyId
      ,CompanyName
      ,HierarchyLevel 
FROM recCTE rc
ORDER BY RootId,HierarchyLevel;

결과

RootId  RootName    PrevId  CompanyId   CompanyName     HierarchyLevel
2       ROOT        2       2           ROOT                1
2       ROOT        2       106         ABC                 2
2       ROOT        106     105         CDF                 3
3       ROOT2       3       3           ROOT2               1
3       ROOT2       3       150         YXZ                 2
3       ROOT2       150     151         XZX                 3
3       ROOT2       150     152         Second below 150    3

간단히 말해서 아이디어 :

  • 우리는 AA 사용 재귀 CTE (오히려입니다 반복 실제로 개념).
  • 첫 번째 SELECT ( 앵커 )는 두 ID가 일치하는 회사로 시작합니다.
  • UNION ALL 이후 두 번째 SELECT 는 중간 결과 줄 연결 하여 다음 수준을 선택합니다.
  • 두 개의 열 RootIdRootName단지를 통과하여 최종 세트에 표시합니다.

이는 HierarchyLevel라인 내의 위치이므로 ROOT 내에 105를 배치 하지만 106 아래에 배치 합니다.

도움이 되었기를 바랍니다...

주어진 구조에 대한 솔루션

말했듯이 주어진 구조는 최선의 선택이 아니므로 변경해야합니다. 그러나 이것을 고수해야한다면 다음과 같이 시도해 볼 수 있습니다.

WITH recCTE AS
(
    SELECT CompanyId AS [RootId],CompanyName AS [RootName],*,1 AS HierarchyLevel FROM @Company WHERE CompanyId=RootCompanyId
    UNION ALL
    SELECT rc.RootId,rc.RootName,c.*,rc.HierarchyLevel+1
    FROM @Company c
    INNER JOIN recCTE rc ON c.RootCompanyId=rc.CompanyId AND c.CompanyId<>rc.CompanyId
)
SELECT rc.CompanyId
      ,rc.CompanyName  
      ,COALESCE(crs.PrimaryCompanyId,rc.RootCompanyId) AS ComputedPrevId
      ,COALESCE(c1.CompanyName,rc.RootName) AS ComputedPrevName
      ,rc.RootId
      ,rc.RootName
FROM recCTE rc
LEFT JOIN @CompanyRelationShip  crs ON rc.CompanyId=crs.CompanyId AND rc.RootCompanyId<>crs.PrimaryCompanyId
LEFT JOIN @Company c1 ON crs.PrimaryCompanyId=c1.CompanyId
ORDER BY rc.RootId,rc.HierarchyLevel;

이것은 먼저 재귀 CTE를 사용하여 루트 회사 아래의 하위 항목을 찾고 관계 테이블에서 해당 줄을 찾으려고 시도합니다.

SELECT *열 목록 대신 사용 하면 전체 세트를 볼 수 있습니다. 사용 LEFT JOIN하면 클로스가 만나지 않을 NULL반환 됩니다 ON.

COALESCE NULL이 아닌 첫 번째 값을 반환하므로 원하는 값을 반환합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Firebase에 계층 적 데이터를 저장하는 방법

분류에서Dev

선택 계층 쿼리를 수행하는 가장 효율적인 방법-SQL Server 2014

분류에서Dev

bash에서 계층 적 데이터를 파일로 에코하는 방법

분류에서Dev

궁극적 인 부모 항목을 얻기 위해 SQL Server 데이터베이스에서 테이블 외래 키 관계의 계층 구조를 동적으로 탐색하는 방법은 무엇입니까?

분류에서Dev

하단 SQL Server에서 계층 구조 경로를 만드는 방법

분류에서Dev

이 일대 다 관계 데이터를 laravel에서 계층 적 순서로 표시하는 방법은 무엇입니까?

분류에서Dev

SQL Server : 테이블에서 계층 구조 조합을 만드는 방법

분류에서Dev

언어 종속 데이터를 사용하여 PostgreSQL에서 계층 적 쿼리를 수행하는 방법

분류에서Dev

RecycleView로 계층 적 데이터 구조를 표시하는 방법은 무엇입니까?

분류에서Dev

Oracle 11g에서 계층 적 조인 데이터의 루트를 얻는 방법

분류에서Dev

c # SQL Server 2014에서 대량의 데이터를 검색하는 더 좋은 방법은 무엇입니까?

분류에서Dev

Aspose Word 문서에서 SQL Server 데이터베이스 이미지 base64를 표시하는 방법

분류에서Dev

matplotlib에서 계층 적 레이블을 만드는 방법

분류에서Dev

MS SQL Server에서 WF Form에 표를 표시하는 방법

분류에서Dev

Django REST에서 계층 적 관계를 직렬화하는 방법

분류에서Dev

SQL Server 2014를 사용하여 Foxpro 데이터베이스 파일에 성공적으로 연결하는 방법은 무엇입니까?

분류에서Dev

계층 적 JSON / JS 데이터를 반복하는 가장 좋은 방법

분류에서Dev

SQL Server 2005에서 내 요구 사항에 따라 데이터를 표시하는 방법

분류에서Dev

SQL Server의 3 개 테이블에서 계층 적 데이터가 필요합니다.

분류에서Dev

SQL Server에서 각 사용자의 누적 합계를 유지하는 방법

분류에서Dev

계층 데이터를 표시하는 SQL 쿼리

분류에서Dev

SQL Server에서 한 열의 데이터를 피하는 방법

분류에서Dev

SQL 계층 구조에 그랜드 부모를 표시하는 방법은 무엇입니까?

분류에서Dev

pheatmap에서 계층 적 클러스터링 노드를 뒤집는 방법

분류에서Dev

Pandas에서 계층 적 필터를 만드는 방법은 무엇입니까?

분류에서Dev

SQL에서 누적 시차를 계산하는 방법

분류에서Dev

시간당 SQL Server에서 데이터베이스 데이터를 필터링하는 방법

분류에서Dev

몽구스 데이터의 계층 적 중첩 객체를 얻는 방법

분류에서Dev

SQL Server : 하나의 테이블에서 계층 적으로 관련된 항목 선택

Related 관련 기사

  1. 1

    Firebase에 계층 적 데이터를 저장하는 방법

  2. 2

    선택 계층 쿼리를 수행하는 가장 효율적인 방법-SQL Server 2014

  3. 3

    bash에서 계층 적 데이터를 파일로 에코하는 방법

  4. 4

    궁극적 인 부모 항목을 얻기 위해 SQL Server 데이터베이스에서 테이블 외래 키 관계의 계층 구조를 동적으로 탐색하는 방법은 무엇입니까?

  5. 5

    하단 SQL Server에서 계층 구조 경로를 만드는 방법

  6. 6

    이 일대 다 관계 데이터를 laravel에서 계층 적 순서로 표시하는 방법은 무엇입니까?

  7. 7

    SQL Server : 테이블에서 계층 구조 조합을 만드는 방법

  8. 8

    언어 종속 데이터를 사용하여 PostgreSQL에서 계층 적 쿼리를 수행하는 방법

  9. 9

    RecycleView로 계층 적 데이터 구조를 표시하는 방법은 무엇입니까?

  10. 10

    Oracle 11g에서 계층 적 조인 데이터의 루트를 얻는 방법

  11. 11

    c # SQL Server 2014에서 대량의 데이터를 검색하는 더 좋은 방법은 무엇입니까?

  12. 12

    Aspose Word 문서에서 SQL Server 데이터베이스 이미지 base64를 표시하는 방법

  13. 13

    matplotlib에서 계층 적 레이블을 만드는 방법

  14. 14

    MS SQL Server에서 WF Form에 표를 표시하는 방법

  15. 15

    Django REST에서 계층 적 관계를 직렬화하는 방법

  16. 16

    SQL Server 2014를 사용하여 Foxpro 데이터베이스 파일에 성공적으로 연결하는 방법은 무엇입니까?

  17. 17

    계층 적 JSON / JS 데이터를 반복하는 가장 좋은 방법

  18. 18

    SQL Server 2005에서 내 요구 사항에 따라 데이터를 표시하는 방법

  19. 19

    SQL Server의 3 개 테이블에서 계층 적 데이터가 필요합니다.

  20. 20

    SQL Server에서 각 사용자의 누적 합계를 유지하는 방법

  21. 21

    계층 데이터를 표시하는 SQL 쿼리

  22. 22

    SQL Server에서 한 열의 데이터를 피하는 방법

  23. 23

    SQL 계층 구조에 그랜드 부모를 표시하는 방법은 무엇입니까?

  24. 24

    pheatmap에서 계층 적 클러스터링 노드를 뒤집는 방법

  25. 25

    Pandas에서 계층 적 필터를 만드는 방법은 무엇입니까?

  26. 26

    SQL에서 누적 시차를 계산하는 방법

  27. 27

    시간당 SQL Server에서 데이터베이스 데이터를 필터링하는 방법

  28. 28

    몽구스 데이터의 계층 적 중첩 객체를 얻는 방법

  29. 29

    SQL Server : 하나의 테이블에서 계층 적으로 관련된 항목 선택

뜨겁다태그

보관