Tester666 |
---|
Добрый день всем! возник такой вопрос - есть таблица с иерархией (inid - идент-р, inidparent - ссылка на родителя из этой же таблицы, inChildNum - номер ребенка среди детей родителя).... |
inChildNum - номер ребенка среди детей родителя - Мне кажется это лишнее...
Таблица для построения дерева.
(id - идент-р, id_par - ссылка на родителя из этой же таблицы, name - наименование узла, ord - поле для сортировки, ... другие поля при необходимости)
Ну и пример
declare @t_tree table (id int not null, id_par int, name varchar(1000) not null, ord int not null)\ninsert into @t_tree (id,id_par,name,ord) Values \n(1, null, \'Узел 1\', 1),\n(2, null, \'Узел 2\', 2),\n(6, 2, \'Узел 21\', 6),\n(7, 6, \'Узел 211\', 7),\n(3, 1, \'Узел 11\', 3),\n(4, 3, \'Узел 111\', 4),\n(5, 1, \'Узел 12\', 5)\n\n\nSELECT * FROM @t_tree\n\n;WITH C ([ID],[ID_PAR],[NAME],[ORD],[Sort]) AS\n(\n\tSELECT B.[ID], B.[ID_PAR],B.[NAME],B.[ORD],\n\t CONVERT(varchar(max), right(REPLICATE(\'0\',10 - LEN(cast(B.[ORD] as varchar(10)))) + cast(B.[ORD] as varchar(10)), 10))\n\t FROM @t_tree AS B WHERE B.[ID_PAR] is null\n\tUNION ALL\n\tSELECT D.[ID], D.[ID_PAR],D.[NAME],D.[ORD],\n\tCONVERT (varchar(max), RTRIM(Sort) + \'| \' + right(REPLICATE(\'0\',10 - LEN(cast(D.[ORD] as varchar(10)))) + cast(D.[ORD] as varchar(10)), 10))\n\tFROM @t_tree AS D\n\tINNER JOIN C\n\tON C.[ID] = D.[ID_PAR]\n)\nSELECT [ID],[ID_PAR],[NAME],[ORD] FROM C\nORDER BY [Sort]
Огромное спасибо всем ребятам, которые мне помогли построить дерево в первый раз...
CTE для построения дерева