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

Откуда: Moscow
Сообщений: 5
Вопрос знатокам от начинающего.
Microsoft SQL Server 2008 R2 - 10.50.1600.1

Есть дерево в таблице Tree (
id int NOT NULL UNIQUE,
id_parent int,
name nvarchar(255) NULL
)
Корневые узлы имеют id_parent = NULL.
У одного потомка может быть только один родитель.

Любой потомок дерева может дополнительно быть потомком других родителей дерева в виде ссылок (ярлыков).
Эти связи хранятся в таблице Links (
id int, -- родитель
id_link -- потомок (ссылка, ярлык)
)

Как оптимально вытянуть запросом (хранимая процедура) из Tree поддерево вместе со ссылками начиная с корня id=N ?

Пример:

CREATE TABLE [dbo].[Tree](
	[id] [int] NOT NULL UNIQUE,
	[id_parent] [int],
	[name] [nvarchar](255)
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Links](
	[id] [int] NOT NULL,
	[id_link] [int] NOT NULL
) ON [PRIMARY]
GO

INSERT INTO Tree (id, id_parent, name) VALUES (1,NULL,'Узел1')
INSERT INTO Tree (id, id_parent, name) VALUES (2,1,'Узел2')

INSERT INTO Tree (id, id_parent, name) VALUES (3,NULL,'Узел3')
INSERT INTO Tree (id, id_parent, name) VALUES (4,3,'Узел4')

INSERT INTO Links (id, id_link) VALUES (1,3)


Поддерево с корнем id=1 должно иметь прямого потомка 2 и ссылки 3 и 4.

id id_parent name
----------------------------
1 NULL Узел1
2 1 Узел2
3 NULL Узел3
4 3 Узел4
20 май 12, 13:14    [12584219]     Ответить | Цитировать Сообщить модератору
 Re: Построение запроса для дерева со ссылками (ярлыками)  [new]
qwerty112
Guest
vladar999
...
id  id_parent  name
----------------------------
1 NULL Узел1
2 1 Узел2
3 NULL Узел3
4 3 Узел4

это НУЛЛ ваще - как, важен ?

;with 
a as 
(select id, id_parent from Tree union all select id_link, id from Links),
b as 
(select id, id_parent from a where id=1 
union all 
select a.id, a.id_parent 
from a inner join b
  on a.id_parent=b.id)

/*
select * from b

id          id_parent
----------- -----------
1           NULL
2           1
3           1
4           3
*/

select b.id, Tree.id_parent, Tree.name  
from b
inner join Tree
  on b.id=Tree.id
/*
id          id_parent   name
----------- ----------- ------
1           NULL        Узел1
2           1           Узел2
3           NULL        Узел3
4           3           Узел4
*/
20 май 12, 16:11    [12584543]     Ответить | Цитировать Сообщить модератору
 Re: Построение запроса для дерева со ссылками (ярлыками)  [new]
vladar999
Member

Откуда: Moscow
Сообщений: 5
qwerty112
это НУЛЛ ваще - как, важен ?


Корневые узлы имеют id_parent = NULL.

Если принципиально мешают можно заменить на 0.
20 май 12, 16:46    [12584652]     Ответить | Цитировать Сообщить модератору
 Re: Построение запроса для дерева со ссылками (ярлыками)  [new]
qwerty112
Guest
vladar999
qwerty112
это НУЛЛ ваще - как, важен ?


Корневые узлы имеют id_parent = NULL.

Если принципиально мешают можно заменить на 0.

не мешает, я о другом ... вообщем - забудь
----

там, в данных, случайно конечно, - не может быть так
INSERT INTO Links (id, id_link) VALUES (1,3)
INSERT INTO Links (id, id_link) VALUES (3,2)
INSERT INTO Links (id, id_link) VALUES (2,1)

?
т.е. - циклов нет ?

мой запрос такое не проверяет ...
20 май 12, 16:58    [12584674]     Ответить | Цитировать Сообщить модератору
 Re: Построение запроса для дерева со ссылками (ярлыками)  [new]
vladar999
Member

Откуда: Moscow
Сообщений: 5
qwerty112
т.е. - циклов нет ?

мой запрос такое не проверяет ...


Нет, дерево собирает юзер ручками и за циклами ссылок следит клиентская программа.
Спасибо за помощь, сейчас погоняю на реальной проге, о результатат сообщу.
А я что-то с CTE не сладил...
20 май 12, 17:08    [12584712]     Ответить | Цитировать Сообщить модератору
 Re: Построение запроса для дерева со ссылками (ярлыками)  [new]
vladar999
Member

Откуда: Moscow
Сообщений: 5
В основном SELECTe наверное DISTINCT стоит добавить - при id=3 строки дублируются.
20 май 12, 17:14    [12584730]     Ответить | Цитировать Сообщить модератору
 Re: Построение запроса для дерева со ссылками (ярлыками)  [new]
vladar999
Member

Откуда: Moscow
Сообщений: 5
qwerty112,
еще раз спасибо огромное, все работает.
20 май 12, 19:07    [12585006]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить