我想看看如何使用递归cte获得素数列表。到目前为止,我能够构建一个数字列表:
with recursive range(i) as (
select 1
union all
select i+1 from range
)
select i from range limit 100;
然而,我一直有点卡在如何为每个数字,看看它是否可以被任何更小的数字整除(我不关心效率,如果数字是17,它可以检查所有数字2-16现在)。
这可能有点粗糙,但我做了一个交叉连接并检查了分子/分母的模数是否为零:
with recursive range(i) as (
select 1
union all
select i+1 from range
where i < 20
)
select
numerator.i,
MIN(numerator.i % divisor.i)=0 is_divisible
FROM
range numerator, range divisor
WHERE
numerator.i > divisor.i
AND divisor.i >= 2
GROUP BY
numerator.i
HAVING
is_divisible=false
这给了我:
I IS_DIVISIBLE
3 FALSE
5 FALSE
7 FALSE
11 FALSE
13 FALSE
17 FALSE
19 FALSE
这里有一个更好的答案:这个递归的SQL CTE究竟是如何工作的?