我有一个树/层次结构组和一个项目的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位掩码。
我不确定数据库是否会使用索引或只是扫描所有行来确定按位结果?
是否有其他(更好?)方法选择我需要的行?
答案 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)
上的索引,效果非常好。