2013-06-07 6 views
0

나는 A, B, C, D로 구성된 계층 구조를 가지고 있습니다. 각 엔티티는 자식과 일대 다 관계를 유지합니다 (A -> 1 : N -> B -> 1 : N -> C -> 1 : N -> D).
LevelIDLevelTypeID 필드 (LevelID은 A, B, C 또는 D에 외래 키입니다. LevelTypeID은 외래 키입니다)를 사용하여 계층 적 엔터티 중 하나에 연결할 수있는 다른 엔터티가 있습니다.여러 열의 값을 하나의 열로 결합

제공된 LevelIDLevelTypeID에 따라 현재 계층 적 엔터티와 상위 상위 수준 엔터티를 제공 할 수있는 쿼리가 필요합니다. 사용

LevelTypeId LevelId 
    ----------- ------- 
    3    100 
    2    10 
    1    1 

LevelId = 다음

LevelId = 100 LevelTypeId = 3 (C), 쿼리가 돌려 사용 4 개 테이블

A 
     ID  
     -- 
     1  
    B 
     ID  A_ID 
     ----  -----  
     10  1 
    C 
     ID  B_ID 
     ----  ----- 
     100  10 
    D 
     ID  C_ID 
     ----- ----- 
     1000  100 
     1001  100 

일부 샘플 데이터이며 1000, LevelTypeId = 4 (D)이면 쿼리는 다음과 같이 반환되어야합니다.

LevelTypeId LevelId 
    ----------- ------- 
    4    1000 
    3    100 
    2    10 
    1    1 

특히 내가 필터링 할 때, 나는 아래 쿼리를 사용했다,하지만 난 정확한 결과를 얻고 있지 않다 LevelId = 100, LevelTypeId = 3

select LevelTypeId, LevelId 
from 
    ( select 
      a.ID as [1], 
      b.ID as [2], 
      c.ID as [3], 
      d.ID as [4] 
     from A a 
     left join B b on a.ID = b.A_ID 
     left join C c on b.ID = c.B_ID 
     left join D d on c.ID = d.C_ID 
     where 
      (@levelTypeId = 4 and D.ID = @levelId) 
      or 
      (@levelTypeId = 3 and C.ID = @levelId) 
      or 
      (@levelTypeId = 2 and B.ID = @levelId) 
      or 
      (@levelTypeId = 1 and A.ID = @levelId) 

    ) p 
unpivot 
    (LevelId FOR LevelTypeId IN ([1], [2], [3], [4])) AS unpvt 

사람이 쿼리 좀 도와 수 있습니까?

+0

저는 귀하의 스키마로 인해 혼란스러워합니다. 당신이 우리에게주는 것은 신분증, 학부모 및 편지 수업입니다. 이것들은 levelid와 leveltypeyid와 어떤 관련이 있습니까? 스키마에서 리터럴 이름을 사용하는 대신 여기에서보다 기술적 인 기능 이름을 사용하면 도움이 될 수 있습니다. –

+0

그 두 번째 단락에서 : "LevelID는 A, B, C 또는 D의 외래 키이고 LevelTypeID는 A, B, C 및 D의 이름이 포함 된 조회 테이블의 외래 키입니다." – BlueChameleon

+0

왜 첫 번째 예제를 통해 나를 안내합니다. 왜냐하면 제안 된 쿼리의 예상 결과가 왜 저에게 불분명했기 때문입니다. 이것은 귀하의 데이터이며 귀하에게 의미가 있지만, 제 관점에서는 명확하게 설명되지 않았습니다. 예를 들어,'LevelId = 101'은 이것에 어디에서 맞습니까? 우리가받은 테이블의 어느 한쪽 열에 나타나지 않습니다. –

답변

1

기존 쿼리의 모든 수준을 반환하는 유일한 레벨 선택이 where 절에서 발생하기 때문에, 가입 - 어떤 수준 모든 레벨을 선택 후, 기준과 일치합니다. 대신 다음을 시도하십시오.

select LevelTypeId, LevelId 
from 
    ( select 
      a.ID as [1], 
      b.ID as [2], 
      c.ID as [3], 
      d.ID as [4] 
     from A a 
     left join B b on a.ID = b.A_ID and @levelTypeId >= 2 
     left join C c on b.ID = c.B_ID and @levelTypeId >= 3 
     left join D d on c.ID = d.C_ID and @levelTypeId >= 4 
     where 
      (@levelTypeId = 4 and D.ID = @levelId) 
      or 
      (@levelTypeId = 3 and C.ID = @levelId) 
      or 
      (@levelTypeId = 2 and B.ID = @levelId) 
      or 
      (@levelTypeId = 1 and A.ID = @levelId) 

    ) p 
unpivot 
    (LevelId FOR LevelTypeId IN ([1], [2], [3], [4])) AS unpvt 

SQLFiddle here

+0

대단히 감사합니다. – BlueChameleon

+0

@BlueChameleon : 다행스럽게 도울 수 있습니다. –

관련 문제