을 자체 조인 나는 대륙이 많은 도시이 많은 미국이 많은 지역이 많은 나라이 자체 조인 계층 테이블의 데이터가 있습니다.가 계층 구조를 평평하게 테이블
자기 결합 테이블 구조는 :
|-------------------------------------------------------------|
| ID | Name | Type | ParentID | IsTopLevel |
|-------------------------------------------------------------|
| 1 | North America | Continent | NULL | 1 |
| 12 | United States | Country | 1 | 0 |
| 113 | Midwest | Region | 12 | 0 |
| 155 | Kansas | State | 113 | 0 |
| 225 | Topeka | City | 155 | 0 |
| 2 | South America | Continent | NULL | 1 |
| 22 | Argentina | Country | 2 | 0 |
| 223 | Southern | Region | 22 | 0 |
| 255 | La Pampa | State | 223 | 0 |
| 777 | Santa Rosa | City | 255 | 0 |
|-------------------------------------------------------------|
나는 성공적 각 노드의 트리 구조와 깊이를 얻기 위해 재귀 CTE를 사용할 수 있었다. 내가 실패한 곳은 피벗을 사용하여 각 하위 위치와 그에 상응하는 각 수준의 멋진 목록을 만드는 것입니다.
예상 결과 :
|------------------------------------------------------------------------------------|
| Continent | Country | Region | State | City | Bottom_Level_ID |
|------------------------------------------------------------------------------------|
| North America | United States | Midwest | Kansas | Topeka | 234 |
| South America | Argentina | Southern | La Pampa | Santa Rosa | 777 |
|------------------------------------------------------------------------------------|
내가 명확히해야 할 몇 가지 핵심 포인트가있다.
모든 단일 항목에는 하단 수준과 최상위 수준이 있습니다. 주어진 위치에 5 가지 유형이 모두 존재하지 않는 경우는 입니다. 나는이 데이터를 작성하는 경우이 표는 지구상의 모든 대륙에 대한 도시 수준에서 얼마나 엄청난 상상할 수
는, 나는 국가 수준에서 북미 50 개 항목이있을 것이다. 행 수십억 개
이유가 필요한 이유는 사람이 살았던 모든 주소의 역사적인 테이블에 가입하고 나무 위로 여행 할 수 있어야하기 때문입니다. 내가 그 테이블에서 LocationID를 가졌다 고 가정하면이 쿼리의 뷰에 조인을하고 해당 열을 넣을 수 있습니다.
이것은 2005 년 이전 데이터베이스이며 sysadmin이나 스키마를 제어하지 않습니다. 주로 유용한 형식으로
내 CTE 코드
--CTE
;WITH Tree
AS (
SELECT ID, Name, ParentID, Type, 1 as Depth
FROM LocationTable
WHERE IsTopLevel = 1
UNION ALL
SELECT L.ID, L.Name, L.ParentID, L.Type, T.Depth+1
FROM Tree T
JOIN LocationTable L
ON L.ParentGUID = T.GUID
)
좋은 고체 데이터. 그러나 나는 그것에 대해 생각해보아야하고 이미이 형식의 테이블 구조가 아니므로 동시에 항목을 함께 사용하지 않으면 깊이 트리 검색을 수행하는 것이 왜 어려울까요?
어쨌든 여기 나머지 부분이 있습니다.
피벗 시도
;WITH Tree
AS (
SELECT ID, Name, ParentID, Type
FROM LocationTable
WHERE IsTopLevel = 1
UNION ALL
SELECT L.ID, L.Name, L.ParentID, L.Type
FROM Tree T
JOIN LocationTable L
ON L.ParentGUID = T.GUID
)
select *
from Tree
pivot (
max(Name)
for Type in ([Continent],[Country],[Region],[State],[City])
) pvt
그리고 지금은 다른 모든 것들에 대한 널 (null)와 열의 유형에 의하여 모든 것을 가지고있다. 이전에 어려움을 겪었으므로 필자의 피벗을 시도하기 전에 CTE 데이터를 필터링/조인해야하지만 어디서부터 시작해야할지 모르겠습니다. 내가 시도한 모든 것은 soooooooooo sloooooooow입니다.
CTE와 피벗을 이해할 때마다 새로운 점이 나를 극도로 냉담하게 만듭니다. 도와주세요.; ;
가 5 열이있는 새로운 데이터 테이블에 훨씬을 쓸 수 있을까 * 사이드 바이 -측면*? 만약 당신이 올바르게 이해한다면, ** 항상 ** 5 가지 레벨이 있습니다. 트리의 유연성과 재귀 적 접근은 전혀 필요하지 않습니다. – Shnugo
스키마를 변경할 수 없습니다. – BlueCucumber