2010-09-08 2 views
1

Мне нужно вернуть родительское дочернее отношение из 3 таблиц, для нижнего, среднего и верхнего уровней соответственно. Легкий материал до сих пор, и уже сделано:построение иерархии из 3 таблиц

SELECT -1 ParentID, ID + 100000 ID, txtName Value from tblLevel1 
UNION 
SELECT Level1ID + 100000 ParentID, ID + 50000 ID, txtName Value from tblLevel2 
UNION 
SELECT Level2ID + 50000 ParentID, ID ID, txtName Value from tblLevel3 

Моя проблема заключается в том, что мне нужно добавить еще одно поле, которое описывает путь каждой записи.

Для первой таблицы это «-1; {id}).
Для второй таблицы находится '{Level1id}; {id}'.
Запрос третьей таблицы должен возвращать '{Level1id}; {Level2id}; {id}'. Тогда проблема в третьей.

Структуры стола:

Level1; ID int; txtName varchar(50)

Level2; ID int; Level1ID int; txtName varchar(50)

Level3; ID int; Level2ID int; txtName varchar(50)

Как получить полный путь в запросе на третьей таблице (Уровень 3)?

Это текущий результат

ParentID ID  Value 
-1  100001 Test company 
-1  100006 Company A 
-1  100007 Company B 
-1  100008 The Primary Client 
-1  100009 Overseas Client 1 
100001 50001 Distribution 
100006 50016 Attributes 
100007 50018 Attributes 
100008 50019 Development 
100009 50029 Database 
50001 1  Balance Sheet 
50001 7  Cash Flow Statement 
50001 10  Income Statement 
50016 20  Vehicles 
50016 21  Drivers 
50019 33  Health 
50029 29  Database 
+0

Было бы проще, если бы вы показать некоторые примеры данных и ожидаемого результата запрос. –

ответ

2

Я бы вопрос структуры базы данных, как отдельную таблицу для каждого «уровня», кажется, как плохая идея для меня. Так как я не знаю всей специфики вашего приложения, я на этом покажу, что так оно и должно быть. Кроме того, вся деятельность по добавлению номеров в идентификаторы выглядит для меня как БОЛЬШОЙ kludge, который укусит вас позже.

Другая, более непосредственная и сдерживающая проблема заключается в том, что похоже, что ваш третий набор результатов имеет различное количество столбцов, чем первые два набора результатов. Это невозможно с помощью оператора UNION.

Если вы хотите добавить еще один столбец к первым двум запросам, то вы сможете получить то, что хотите в третьем запросе, просто путем соединения между таблицами уровня 3 и уровня 2, чтобы получить идентификатор уровня 1.

+0

Я предполагаю на данный момент, что это как должно быть Это правильно. Мне нужно обновить существующую систему и сделать ее по страницам, используя более современные элементы управления. к сожалению, сейчас уже родилась боль, связанная с ложными иерархиями и т. д. Спасибо за ваш вклад. Имейте лодку. – callisto

1

решаемые его присоединения к level2 в отборное на уровне 3:

SELECT -1 ParentID, ID + 100000 ID, txtName Value, '-1;'+ cast(ID as varchar(10)) nodePath from tblLevel1 
UNION 
SELECT Level1ID + 100000 ParentID, ID + 50000 ID, txtName Value, '-1;'+ cast(Level1ID as varchar(10))+ ';'+ cast(ID as varchar(10)) nodePath from tblLevel2 
UNION 
SELECT Level2ID + 50000 ParentID, ID ID, txtName Value '-1;'+ cast(p.Level1ID as varchar(10))+ ';'+cast(m.Level2ID as varchar(10))+ ';'+cast(m.ID as varchar(10)) nodePath from tblLevel3 
inner join tblLevel2 p on p.ID = m.Level2ID 

Результаты:

-1  100001 RRM Financial Master Templates -1;1 
-1  100006 Company A      -1;6 
-1  100007 Company B      -1;7 
-1  100008 The Primary Client    -1;8 
-1  100009 Overseas Client 1    -1;9 
100001 50001 Distribution     -1;1;1 
100006 50016 Attributes      -1;6;16 
100007 50018 Attributes      -1;7;18 
100008 50019 Development      -1;8;19 
100009 50029 Database      -1;9;29 
50001 1  Balance Sheet     -1;1;1;1 
50001 7  Cash Flow Statement    -1;1;1;7 
50001 10  Income Statement    -1;1;1;10 
50016 20  Vehicles      -1;6;16;20 
50016 21  Drivers       -1;6;16;21 
50019 33  Health       -1;8;19;33 
50029 29  Database      -1;9;29;29 
Смежные вопросы