我有一个基于层次结构(父子)角色的结构用于授权。我有一个简单的架构,它存储角色及其父级的ID。现在我获得了一个role_id,我希望从中获得该角色的所有父母。
例如,我有一个这样的表:
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 Windows Azure上使用Microsoft SQL服务器。
我对SQL的了解有限。请帮忙
答案 0 :(得分: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 强>