[英]SQL neatly self join a table n times
我正在为一个项目构建一个后端,以构建一个(纯功能的)图形数据库系统。
我正在尝试实现的一个操作是将预先计算的视图准确地自我连接到自身n次(即找到正好是图中特定关系的n个实例的结果对)。
我想出的一个稍微丑陋的解决方案是以类似于平方的求幂的方式生成一棵大的连接树
有没有更整洁/更好的方法呢? 也许使用递归查询?
每个可能的预生成视图都有一个left_id和right_id字段,它们表示实体表中的索引。
下面是一个简化的示例:
给n -> succ(n)
表代表关系n -> succ(n)
(实际上,该关系可能要复杂得多)
left_id | right_id
__________________
1 | 2
2 | 3
3 | 4
4 | 5
5 | 6
7 | 8
n = 3的理想查询结果是
left_id | right_id
__________________
1 | 4
2 | 5
3 | 6
4 | 7
5 | 8
(我之所以使用SQL的原因是,该项目的一部分是为了证明SQL对于这样的系统来说是一个糟糕的选择,然后是一个更为量身定制的后端,以使用基础关系而不是SQL来解决问题。图模型)
许多数据库都支持递归CTE,这些CTE直接支持这种图行走。
即使在没有数据库的数据库中,使用动态SQL和WHERE
子句也不会特别困难:
对于n = 1:
select t1.left_id, t2.right_id
from t t1 join
t t2
on t2.left_id = t1.right_id;
对于n = 2:
select t1.left_id, t3.right_id
from t t1 join
t t2
on t2.left_id = t1.right_id join
t t3
on t3.left_id = t2.right_id;
对于n = 3:
select t1.left_id, t4.right_id
from t t1 join
t t2
on t2.left_id = t1.right_id join
t t3
on t3.left_id = t2.right_id join
t t4
on t4.left_id = t3.right_id;
每个“ n”的附加值都会添加另一个join
条件。 这些查询可以很容易地利用表上的索引,因此性能应该合理。
这比图数据库好还是坏,在某种程度上尚无定论。 每种类型的数据库都有不同的优势。 许多关系数据库确实支持递归CTE(并因此支持图形遍历)。 但是,在专门为此目的设计的软件系统上,性能可能会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.