这个递归SQL CTE是如何工作的?
有人能给我解释一下这个SQL查询是如何工作的吗这个递归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
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