2016-06-26 4 views
0

У меня есть таблица users_entities, она содержит пользователей, их сущности и их зависимые объекты. Как это.Рекурсивная Sybase Select

|user | entity | dependant entity| 
---------------------------------- 
| 122 | 746414 |  null  | 
| 122 | 746410 |  746414  | 
| 122 | 746405 |  746414  | 
| 333 | 746403 |  746405  | 

Так, с

select entity from users_entities where user = 122 

я получаю: 706414, 706410 и 746405.

Все лиц, в которых 122 отвечает, но я также должен показать все объекты, которые зависят от этих объектов. Таким образом, я также должен показать 746403, потому что это зависит от 746405.

Это древовидная структура

74614 
    | 
746405 
    | 
746403 

Я полагаю, что я должен сделать рекурсивный выбрать, но я не могу это сделать. Можно ли это сделать с помощью одного выбора? Или мне нужно будет выполнить функцию или хранимую процедуру? Благодарю.

Редактировать О, я забыл. Они могут быть несколькими уровнями иждивенцев.

+0

Вы можете иметь несколько уровней иждивенцев? – sgeddes

+0

@sgeddes Да, я могу иметь несколько уровней иждивенцев. Извините, я забыл эту часть. – user3063952

ответ

0

Вы должны сделать самостоятельное соединение. Но вам нужно знать максимальное количество уровней. Если максимум равен, скажем, 5, то вы можете написать 5-позиционное самоуправление. Когда вы используете внешние предикаты соединения, он должен иметь возможность обрабатывать все, что меньше, чем количество уровней. Что-то вроде этого (я не проверял запрос, но вы получите идею, это делается для максимального 3 уровня, но вы можете продлить его):

select t1.user as user1, t2.user as user2, t3.user as user3 
from 
users_entities t1 
left outer join users_entities t2 
on t1.entity = t2.entity 
left outer join users_entities t3 
on t2.entity = t3.entity 
where t1.user = 122