나는 A, B, C, D로 구성된 계층 구조를 가지고 있습니다. 각 엔티티는 자식과 일대 다 관계를 유지합니다 (A -> 1 : N -> B -> 1 : N -> C -> 1 : N -> D).
LevelID
및 LevelTypeID
필드 (LevelID
은 A, B, C 또는 D에 외래 키입니다. LevelTypeID
은 외래 키입니다)를 사용하여 계층 적 엔터티 중 하나에 연결할 수있는 다른 엔터티가 있습니다.여러 열의 값을 하나의 열로 결합
제공된 LevelID
및 LevelTypeID
에 따라 현재 계층 적 엔터티와 상위 상위 수준 엔터티를 제공 할 수있는 쿼리가 필요합니다. 사용
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
사람이 쿼리 좀 도와 수 있습니까?
저는 귀하의 스키마로 인해 혼란스러워합니다. 당신이 우리에게주는 것은 신분증, 학부모 및 편지 수업입니다. 이것들은 levelid와 leveltypeyid와 어떤 관련이 있습니까? 스키마에서 리터럴 이름을 사용하는 대신 여기에서보다 기술적 인 기능 이름을 사용하면 도움이 될 수 있습니다. –
그 두 번째 단락에서 : "LevelID는 A, B, C 또는 D의 외래 키이고 LevelTypeID는 A, B, C 및 D의 이름이 포함 된 조회 테이블의 외래 키입니다." – BlueChameleon
왜 첫 번째 예제를 통해 나를 안내합니다. 왜냐하면 제안 된 쿼리의 예상 결과가 왜 저에게 불분명했기 때문입니다. 이것은 귀하의 데이터이며 귀하에게 의미가 있지만, 제 관점에서는 명확하게 설명되지 않았습니다. 예를 들어,'LevelId = 101'은 이것에 어디에서 맞습니까? 우리가받은 테이블의 어느 한쪽 열에 나타나지 않습니다. –