我尝试过sql server,db2,postgreSQL和Mysql。有些支持递归的基本功能,但都不支持这样的相互递归:
WITH RECURSIVE
x (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM y WHERE id < 5),
y (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 5)
SELECT * FROM x;
这是可能的:只需使用
second cte
(y (id)
) 作为 子查询
WITH
x (id) AS (SELECT 1
UNION ALL
SELECT y.id+1 FROM
(SELECT 1 id UNION ALL SELECT id+1 FROM x WHERE id < 5) y
WHERE y.id < 5)
SELECT * FROM x;
此方法适用于您提到的大多数 RDBMS。 但这些查询可能会陷入无限循环。
Materialize 和 Feldera 支持相互递归。