2

我有一个基于分层(父子)角色的结构用于授权。我有一个简单的模式,它存储角色及其父级的 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_IDof8时,查询应该返回我:

ROLE_ID
      1
      2
      5
      8

既然OH ORTHABC OH. ABC OH是 的孩子ABC ECABC EC是 的孩子,ABC CORP我应该得到1,5和.21

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

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

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

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

4

1 回答 1

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 演示

于 2013-06-25T08:21:09.133 回答