使用递归 SQL cte 的素数生成器

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

以下是使用递归 CTE 的素数生成器的尝试:

WITH RECURSIVE prime(num, is_prime) AS (
    SELECT 1, 1
    UNION ALL
    SELECT 
        num+1, 
        IF( num+1 IN (2,3,5,7) OR (
            (num+1)%2!=0 AND 
            (num+1)%3!=0 AND 
            (num+1)%4!=0 AND 
            (num+1)%5!=0 AND 
            (num+1)%6!=0 AND 
            (num+1)%7!=0 AND 
            (num+1)%8!=0 AND 
            (num+1)%9!=0 AND 
            (num+1)%10!=0), 
          num+1, NULL
         )
    FROM prime WHERE num < 100
) SELECT * FROM prime;

┌─────┬──────────┐
│ num ┆ is_prime │
╞═════╪══════════╡
│   1 ┆        1 │
│   2 ┆        2 │
│   3 ┆        3 │
│   4 ┆          │
│   5 ┆        5 │
│   6 ┆          │
│   7 ┆        7 │
│   8 ┆          │
 ...etc...

我知道这包括可以优化的项目(例如

MOD 9
MOD 10
),但我将它们留在那里以使事情更加明确。有没有另一种方法可以做到这一点,而不必单独写出每个案例?例如,拥有类似
RANGE(10)
的东西并基于它进行迭代(无需编写程序代码/扩展)。

什么可能是一种创造性的方法来做到这一点,甚至可能使用另一种递归 CTE?

sql recursion common-table-expression
1个回答
0
投票

不确定你需要达到多高,但我测试了上限为 10,000,返回了 1229 个素数结果。

WITH Numbers AS (
    SELECT   2 AS Number
    UNION ALL
    SELECT   Number + 1
    FROM     Numbers
    WHERE    Number < 10000) -- Highest prime number to include

,Primes AS (
    SELECT   Number
    FROM     Numbers
    WHERE NOT EXISTS (
        SELECT   1
        FROM     Numbers n
        WHERE    n.Number < Numbers.Number
        AND      Numbers.Number % n.Number = 0))

SELECT   TOP 2000 Number -- Max number of results to return
FROM     Primes
OPTION   (MAXRECURSION 0)
© www.soinside.com 2019 - 2024. All rights reserved.