是否有可能在SQL中获取特定角色的所有父级?

时间:2013-06-25 08:07:35

标签: sql sql-server parent-child hierarchical-data

我有一个基于层次结构(父子)角色的结构用于授权。我有一个简单的架构,它存储角色及其父级的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 ORTHABC OH的孩子。 ABC OHABC EC的孩子。 ABC ECABC CORP的孩子,我应该1521

在上面的例子中,只有4个级别。但是,在实际情况中,可能会有很多层次。

我尝试使用谷歌搜索解决这个问题并偶然发现here。但这对Oracle来说是特别的,它在Microsoft SQL Server上执行查询时会出现语法错误。

这可能吗?我在Microsoft Windows Azure上使用Microsoft SQL服务器。

我对SQL的了解有限。请帮忙

1 个答案:

答案 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