根据分层权限选择行

时间:2011-08-20 10:06:38

标签: sql

我有一个树/层次结构组和一个项目的SQL表,每个项目都与一个组相关联(即每个项目属于一个组)。我只需要选择与给定组关联的行,或者选择下面的组。

例如。说这是组树:

A
 => B
     => D
 => C
     => E
     => F

选择A组的项目将返回所有行,而选择C组将选择属于C,E和F的项目(C的后代)。

到目前为止,我认为我可以通过以下两种方式之一实现这一点:

1。列表

SELECT * FROM table WERE Group in ('C','E','F') 

在查询之前以编程方式确定后代列表

2。 BITWISE运营商

SELECT * FROM table WHERE GroupBitMask &  52!=0

(即按位'C'+'E'+'F'==第3位+第5位+第6位== 110100 == 52)

再次,需要在查询之前通过解析组树来计算此52。 我想我最多可以强制限制64组。并为此使用64位掩码。

我不确定数据库是否会使用索引或只是扫描所有行来确定按位结果?

是否有其他(更好?)方法选择我需要的行?

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是将祖先存储为行的一部分:

Group     Path    Other columns
A         A       ...
B         AB      ...
C         AC      ...
D         ABD     ...
E         ACE     ...
F         ACF     ...

您可以使用单个查询检索基本路径:

select Path from YourTable where Group = 'C'

然后您可以查询所有后代:

select * from YourTable where path like 'AC%'

使用(Group)上的主键和(Path)上的索引,效果非常好。