【问题标题】:Write a query to print all prime numbers less than or equal to写一个查询打印所有小于或等于的素数
【发布时间】:2023-02-23 01:06:21
【问题描述】:

编写一个查询来打印所有小于或等于的素数。将结果打印在一行中,并使用与号 (&) 字符作为分隔符(而不是空格)。

例如,所有质数 (<= 10) 的输出将是:

输出:2&3&5&7

【问题讨论】:

  • 这是作业吗?选择 RDBMS,因为它们各不相同。
  • 谁再打印?为什么不传真清单?
  • 您的查询将包括:递归公用表表达式 (RCTE) 以生成从 1 到 10 的数字表,自左连接以获取当前数字的所有除数(从 2 到当前 - 1),按当前数字对结果进行分组,除法模的计算。结果应该与 listagg 函数之类的东西聚合。尝试自己实施并展示结果。

标签: sql


【解决方案1】:

不同的 RDBMS 有自己的 RCTE 和字符串聚合语法/函数。
以下是 PostgreSQL 的示例:

WITH RECURSIVE T (I) AS (SELECT 1 UNION ALL SELECT I+1 FROM T WHERE I < 10)
SELECT STRING_AGG (I::TEXT, '&') AS LST
FROM
(
  SELECT A.I 
  FROM T A
  LEFT JOIN T B ON B.I BETWEEN 2 AND A.I - 1
  -- Actually, 1 is prime as well...
  WHERE A.I > 1
  GROUP BY A.I
  HAVING COUNT (CASE MOD (A.I, B.I) WHEN 0 THEN 1 END) = 0
  ORDER BY A.I
) A
LST
2&3&5&7

【讨论】:

    【解决方案2】:

    下面提供的解决方案可能会有所帮助。微软数据库

    DECLARE @n INT = 1000;
    DECLARE @x INT = 2;
    DECLARE @z INT;
    DECLARE @temp TABLE (A INT)
    
    WHILE (@x <= @n)
    BEGIN
        INSERT INTO @temp
        SELECT @x
    
        SET @z = 2
    
        WHILE (@z < @x)
        BEGIN
            IF (@x % @z <> 0)
            BEGIN
                SET @z = @z + 1
            END
            ELSE
            BEGIN
                DELETE
                FROM @temp
                WHERE A = @x
    
                BREAK
            END
        END
    
        SET @x = @x + 1
    END;
    
    SELECT STRING_AGG(A, '&')
    FROM @temp
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2012-01-10
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多