SQLite 合并/联合/展平子查询

问题描述 投票:0回答:0

我正在尝试按照 https://www.sqlite.org/lang_with.html.

中的“古怪递归查询”示例编写一些 SQL 代码

特别是,我正在尝试使用 SQL 制作素筛。我尝试了使用

EXCEPT
而不是 union 的递归 cte,但这是禁止的:

CREATE TABLE target AS SELECT 25 AS i, 100 AS n;

WITH RECURSIVE primes AS (
    SELECT
        value AS p
    FROM GENERATE_SERIES(3, (SELECT target.n FROM target LIMIT 1), 2)
    EXCEPT
    SELECT
        (SELECT value FROM GENERATE_SERIES(p*p, (SELECT target.n FROM target LIMIT 1), p))
    FROM
        primes
)

这失败了,因为

EXCEPT
子句在递归 ctes 中不允许,只有
UNION
和也许
INTERSECT
.

反正我后来尝试了效率低但不那么荒唐的

WITH multiples AS (
    SELECT
        (SELECT value AS p FROM GENERATE_SERIES(n.value*n.value, (SELECT target.n FROM target LIMIT 1), n.value))
    FROM
        GENERATE_SERIES(3, (SELECT SQRT(target.n) FROM target LIMIT 1), 2) n
)
SELECT * FROM multiples;

但是结果只有

9, 25, 49, 81
,没有
9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99, 25, 35, 45, 55, 65, 75, 85, 95, 49, 63, 77, 91, 81, 99

如何合并子查询结果而不是只获取每个子查询的第一个条目?

我认为有一个名为

UNNEST
的函数可以在某些 SQL 风格中神奇地执行此操作,但它不是在 SQLite 中。我读到 SQLite 实际上并没有实现数组,这解释了为什么
GENERATE_SERIES
只能用作表而缺少
UNNEST
,但我对 SQL 了解不多,所以我不知道所有的含义这个。

UNION ALL
也可以正常工作,除了 afaik 它只适用于一张桌子;我不能
UNION ALL
对表中所有行的相关子查询。

sql sqlite subquery correlated-subquery
© www.soinside.com 2019 - 2024. All rights reserved.