Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как вывест дерево из двух таблиц?  [new]
Veligord
Member

Откуда: Москва
Сообщений: 92
Есть две таблицы: категории (ID, Title) и подкатегории (ID, ParentID, Title). Каким образом можно свести их в таблицу вида


ID категории 1 | Заголовок категории 1
ID подкатегории 1 | Заголовок подкатегории 1
ID подкатегории 2 | Заголовок подкатегории 2
ID подкатегории 3 | Заголовок подкатегории 3
ID категории 2 | Заголовок категории 2
ID подкатегории 1 | Заголовок подкатегории 1
ID подкатегории 2 | Заголовок подкатегории 2
ID подкатегории 3 | Заголовок подкатегории 3

Подозреваю, что это как-то можно сделать используя рекурсивный cte, но как не знаю.
18 май 11, 14:17    [10671454]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
ё
Guest
select ID, Title
from

(select ID, Title, ID as orderby1, 1 as orderby2
from категории

union all

select ID, Title, ParentID, 2 
from подкатегории) a 

order by orderby2, orderby1 
18 май 11, 14:21    [10671490]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
Veligord
Member

Откуда: Москва
Сообщений: 92
Спасибо конечно, но, к сожалению, работает не так, как хотелось: сначала выводятся все категории, а затем все подкатегории :(
18 май 11, 14:59    [10671829]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
ё
Guest
Veligord
Спасибо конечно, но, к сожалению, работает не так, как хотелось: сначала выводятся все категории, а затем все подкатегории :(



...т.е. - переписать без ошибок - не получилось ? ...нда...
18 май 11, 15:04    [10671866]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
ё
Guest
ё
Veligord
Спасибо конечно, но, к сожалению, работает не так, как хотелось: сначала выводятся все категории, а затем все подкатегории :(



...т.е. - переписать без ошибок - не получилось ? ...нда...

пардон,
сам неправ
select ID, Title
from

(select ID, Title, ID as orderby1, 1 as orderby2
from категории

union all

select ID, Title, ParentID, 2 
from подкатегории) a 

order by orderby1, orderby2

18 май 11, 15:06    [10671884]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Veligord
Есть две таблицы: категории (ID, Title) и подкатегории (ID, ParentID, Title).


И что, эти таблицы как то связаны ?
18 май 11, 15:07    [10671890]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
Veligord
Member

Откуда: Москва
Сообщений: 92
ё, спасибо теперь работает работает. Ё, вы не могли бы пояснить, что означают цифры 1 и 2?

Glory, в parentID таблицы подкатегории хранится ID категории.
18 май 11, 15:27    [10672094]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Veligord
Glory, в parentID таблицы подкатегории хранится ID категории.

и где тут тогда дерево и рекурсия ?
18 май 11, 15:29    [10672107]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
Veligord
Member

Откуда: Москва
Сообщений: 92
Да согласен не корректно назвал тему, корневого узла то нет.
18 май 11, 15:33    [10672155]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
Veligord
Member

Откуда: Москва
Сообщений: 92
Veligord
ё, спасибо теперь работает работает. Ё, вы не могли бы пояснить, что означают цифры 1 и 2?


Глупость спросил, разобрался.
18 май 11, 15:43    [10672272]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Может что-то в роде этого:
declare @t_categ table (ID int, Title varchar(100))
insert into @t_categ (ID, Title) values
 (1,'категория 1')
,(2,'категория 2')
,(3,'категория 3')

SELECT * FROM @t_categ

declare @t_podkat table (ID int, ParentID int, Title varchar(100))
insert into @t_podkat (ID, ParentID, Title) values
 (4,1,'Заголовок подкатегории 11')
,(5,1,'Заголовок подкатегории 12')
,(6,1,'Заголовок подкатегории 13')
,(7,2,'Заголовок подкатегории 21')
,(8,2,'Заголовок подкатегории 22')
,(9,2,'Заголовок подкатегории 23')
,(10,3,'Заголовок подкатегории 31')
,(11,3,'Заголовок подкатегории 32')
,(12,3,'Заголовок подкатегории 33')

select * from @t_podkat

;with c ([ID],[par],[Title],[sort]) as 
(
	select B.[ID],null,B.[Title],
	  CONVERT(varchar(max), right(REPLICATE('0',10 - LEN(cast(B.[id] as varchar(10)))) + cast(B.[id] as varchar(10)), 10)) as [Sort]
	  from @t_categ B
	union all
	select D.[ID],D.ParentID as [par], d.[Title],
	  CONVERT (varchar(max), RTRIM(Sort) + '|' + right(REPLICATE('0',10 - LEN(cast(D.[id] as varchar(10)))) + cast(D.[id] as varchar(10)), 10)) as [Sort]
	from @t_podkat D
	inner join C
	on C.ID = d.ParentID
)

select [Title] from c order by [Sort]
Единственный минус это уникальность ID по обеим таблицам....
18 май 11, 15:43    [10672281]     Ответить | Цитировать Сообщить модератору
 Re: Как вывест дерево из двух таблиц?  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
И вообще-то деревья немного не так строятся на мой взгляд. Нет в обеих таблицах поля [ORD] - порядок записей...
18 май 11, 15:46    [10672329]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить