简短结论:传统(基础)关系代数不能直接表达递归查询,但“扩展的关系代数”(如加入递归算子 / 固定点算子)可以。
下面分层次说明。
经典关系代数包含:
这些算子都是有限次组合,每一步操作都在“当前关系”上进行,没有“循环”或“自我引用”的能力。
例如“求一个图中所有可达节点”:
从 A 出发,能到达哪些点?
这需要在已有路径基础上不断扩展路径,直到不再变化——这是递归过程。
用纯关系代数写不出来(无法表达“反复应用直到稳定”)。
实际数据库系统通过扩展来支持递归,例如:
引入:
lfp例如传递闭包:
R⁺ = lfp(X) = R ∪ (X ⋈ R)
表示:从 R 开始,不断自己和自己连接,直到不再增加。
虽然 SQL 不是纯关系代数,但可以看作关系代数的扩展:
WITH RECURSIVE Reach(x) AS (
SELECT A FROM Edge
UNION
SELECT e.to
FROM Reach r, Edge e
WHERE r.x = e.from
)
SELECT * FROM Reach;
这本质上就是递归关系代数。
纯关系代数不能表达递归查询;但引入递归或固定点算子的扩展关系代数可以,这也是 SQL 中
WITH RECURSIVE的理论基础。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。