2013-06-25 6 views
2

У меня есть иерархическая структура (родитель-ребенок), которая будет использоваться для авторизации. У меня есть простая схема, в которой хранятся роли вместе с идентификатором их родителя. Теперь мне присваивается role_id, из которого я хочу получить всех родителей от этой роли.Возможно ли получить все родительские роли определенной роли в SQL?

К примеру, у меня есть таблица вроде этого:

ROLE_ID ROLENAME IS_PARENT PARENT_ROLE_ID 
1  1 ABC CORP   Y   NULL 
2  2 ABC EC   Y   1 
3  3 ABC WC   Y   1 
4  4 ABC NY   Y   2 
5  5 ABC OH   Y   2 
6  6 NY ORTH   N   4 
7  7 NY CARD   N   4 
8  8 OH ORTH   N   5 
9  9 OH CARD   N   5 

Теперь, когда я снабжен ROLE_ID из 8, запрос должен возвращать мне:

ROLE_ID 
     1 
     2 
     5 
     8 

Поскольку OH ORTH является ребенок ABC OH. ABC OH - ребенок ABC EC. ABC EC является ребенком ABC CORP, я должен получить 1, 5, 2 и 1.

В приведенном выше примере есть только 4 уровня. Но в реальной ситуации может быть много уровней.

Я попытался найти решение для решения этой проблемы и наткнулся на here. Но это особенно важно для Oracle, и это дает мне синтаксическую ошибку при выполнении запросов на Microsoft SQL Server.

Возможно ли это? Я использую Microsoft SQL Server на Microsoft Windows Azure.

У меня ограниченное знание SQL. Пожалуйста, помогите

ответ

1

Да, это возможно. Вы можете использовать рекурсивный CTE.

http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

;WITH RCTE AS 
(
    SELECT ROLE_ID, PARENT_ROLE_ID FROM Table1 
    WHERE ROLE_ID = 8 

    UNION ALL 

    SELECT t.ROLE_ID, t.PARENT_ROLE_ID FROM RCTE r 
    INNER JOIN Table1 t on r.PARENT_ROLE_ID = t.ROLE_ID 
) 
SELECT * FROM RCTE 

SQLFiddle DEMO

+0

Благодаря человеку. Работала для меня. :) –

Смежные вопросы