有人可以向我解释这个SQL查询是如何工作的吗?这个递归SQL CTE是如何工作的?
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;
这将产生在PostgreSQL以下:
n
====
251
887
601
647
577
...
9
(177 rows)
我的行由行击穿的理解:
SELECT 2 n
- 选择编号2作为N [锚定构件CTE]
UNION ALL
- 与来自n < 1000的递归分量n + 1结合,因此显示所有数字从2到1000
SELECT a.n FROM n a
- 运行上述查询[CTE的递归构件]
LEFT JOIN n b
- 左边与第二组数字
ON b.n < sqrt(a.n)
加入号2-1000 - 在所述第二组数字小于第一列数字的平方根?
GROUP BY a.n
- 只显示数字
HAVING a.n=2 OR MIN(a.n. % b.n) > 0
的第一列 - ...,其中A = 2或A模B的最小值为大于0?
这是一个愚蠢的查询,但任何帮助解密它将不胜感激。
我认为这里的意图是生成少于1000的素数。但是,结果似乎并没有证实,因为你得到25,49等 –
仔细观察结果,我认为你的查询生成所有素数并且它们的正方形小于1000.但是你必须在'having'子句中增加一个条件'HAVING = 2或者= 3或者MIN(an%bn)> 0'来在结果中包括3。 –