Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个递归SQL CTE是如何工作的?_Sql_Common Table Expression_Recursive Query - Fatal编程技术网

这个递归SQL CTE是如何工作的?

这个递归SQL CTE是如何工作的?,sql,common-table-expression,recursive-query,Sql,Common Table Expression,Recursive Query,有人能给我解释一下这个SQL查询是如何工作的吗 WITH recursive n(n) AS ( SELECT 2 n UNION ALL SELECT n+1 FROM n WHERE n<1000 ) SELECT a.n FROM n a LEFT JOIN n b ON b.n < sqrt(a.n) GROUP BY a.n HAVING a.n=2 OR MIN(a.n % b.n) > 0; 我对逐行细分的理解: 选择2 n-选择数字2作为n

有人能给我解释一下这个SQL查询是如何工作的吗

WITH recursive n(n) AS (
  SELECT 2 n
  UNION ALL
  SELECT n+1 FROM n WHERE n<1000
)
SELECT a.n
FROM n a
  LEFT JOIN n b
  ON b.n < sqrt(a.n)
GROUP BY a.n
HAVING a.n=2 OR MIN(a.n % b.n) > 0;
我对逐行细分的理解:

选择2 n-选择数字2作为n[CTE的锚定成员]

UNION ALL-与n 0-…中的递归分量n+1组合,其中A=2或模B的最小值大于0


这是一个愚蠢的查询,但如果您能帮助破译它,我们将不胜感激。

如果您的查询得到正确修复,将生成1000以下的素数列表:

WITH recursive n(n) AS (
  SELECT 2 n
  UNION ALL
  SELECT n+1 FROM n WHERE n<1000
)
SELECT a.n
FROM n a
  LEFT JOIN n b
  ON b.n <= sqrt(a.n)                        -- Fix #1
GROUP BY a.n
HAVING a.n=2 OR a.n=3 OR MIN(a.n % b.n) > 0  -- Fix #2
ORDER BY a.n ASC
解释相当简单:查询的递归部分只是一种方法,可以为您提供从2(包含)到1000(排除)的数字列表。您可以将递归子句替换为用连续整数填充的实际表

然后将这些数字输入到查询的非CTE部分,并在条件b.n
这里是您查询中的第一个错误:我认为这里的目的是生成小于1000的素数。然而,结果似乎并不能证实当你得到25,49等时,仔细观察结果,我认为你的查询生成的所有素数及其平方都小于1000。但是您必须在having子句中添加一个条件,即a.n=2或a.n=3或MINa.n%b.n>0以在结果中包含3。
WITH recursive n(n) AS (
  SELECT 2 n
  UNION ALL
  SELECT n+1 FROM n WHERE n<1000
)
SELECT a.n
FROM n a
  LEFT JOIN n b
  ON b.n <= sqrt(a.n)                        -- Fix #1
GROUP BY a.n
HAVING a.n=2 OR a.n=3 OR MIN(a.n % b.n) > 0  -- Fix #2
ORDER BY a.n ASC