У меня есть данные в автообъединении иерархической таблицы, где Континенты имеют много Страны имеют много Регионов имеет много Штатов много Города.Flatten иерархии на автообъединение таблицы
самоприсоединение структура таблицы:
|-------------------------------------------------------------|
| 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 |
|-------------------------------------------------------------|
Я был в состоянии успешно использовать рекурсивный КТР, чтобы получить структуру дерева и глубину каждого узла. Там, где я терпит неудачу, я использую стержень, чтобы создать хороший список всех нижних позиций и их соответствующих родителей на каждом уровне.
Ожидаемые результаты:
|------------------------------------------------------------------------------------|
| 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 |
|------------------------------------------------------------------------------------|
Есть несколько ключевых моментов, которые я должен уточнить.
Каждая отдельная запись имеет нижний уровень и верхний уровень. Нет случаев, когда все пять типов не представлены для данного местоположения.
Если я заполнил эти данные, я бы 50 записей для Северной Америки на государственном уровне, так что вы можете себе представить, насколько огромна эта таблица находится на уровне города на всех континентах планеты. Billions строк.
Причина, по которой это необходимо, заключается в том, что мне нужно иметь возможность присоединиться к исторической таблице всех адресов, в которых жил человек, и путешествовать по дереву. Я полагаю, что если у меня есть LocationID из этой таблицы, я могу просто LEFT JOIN на просмотр этого запроса и набить соответствующие столбцы.
Это старая база данных, 2005, и у меня нет системного администратора или управления схемой.
Мой КТР Код
--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
И теперь у меня есть все, что по типу в колонке, с нулями для всего остального. Поскольку я боролся с ранее, мне нужно отфильтровать/присоединиться к данным CTE, прежде чем я попытаюсь установить точку опоры, но я понятия не имею, с чего начать эту пьесу. Все, что я пробовал, это soooooooooo sloooooooow.
Каждый раз, когда я думаю, что я понимаю CTE и Pivot, что-то новое делает меня чрезвычайно униженным. Пожалуйста, помогите мне.; ;
было бы возможно написать целую партию в новом DataTable с 5 столбцов * бок -боковая сторона*? Если я правильно вас понимаю, есть ** всегда ** пять уровней сверху вниз ... Гибкость дерева и рекурсивный подход вообще не нужны ... – Shnugo
Я не могу изменить схему. – BlueCucumber