首页 > 数据库 > 数据库开发技术 > SQL查找100以内的所有质数
-- MySQL、PostgreSQL、SQLite
WITH RECURSIVE t(n) AS (
SELECT 2
UNION ALL
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n
FROM t t1
WHERE t1.n = 2
OR NOT EXISTS (
SELECT 1
FROM t t2
WHERE t2.n BETWEEN 2 AND sqrt(t1.n)+1
AND t1.n%t2.n = 0
);
n |
--+
2|
3|
5|
7|
11|
13|
17|
19|
23|
29|
31|
37|
41|
43|
47|
53|
59|
61|
67|
71|
73|
79|
83|
89|
97|
-- Oracle
WITH t(n) AS (
SELECT 2 FROM dual
UNION ALL
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n
FROM t t1
WHERE t1.n = 2
OR NOT EXISTS (
SELECT 1
FROM t t2
WHERE t2.n BETWEEN 2 AND sqrt(t1.n)+1
AND MOD(t1.n, t2.n) = 0
);
-- Microsoft SQL Server
WITH t(n) AS (
SELECT 2
UNION ALL
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n
FROM t t1
WHERE t1.n = 2
OR NOT EXISTS (
SELECT 1
FROM t t2
WHERE t2.n BETWEEN 2 AND sqrt(t1.n)+1
AND t1.n%t2.n = 0
);
-- MySQL、PostgreSQL、SQLite
WITH RECURSIVE t(n) AS (
SELECT 1
UNION ALL
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n*t2.n
FROM t t1, t t2
WHERE t1.n <= t2.n AND t1.n*t2.n > 1 AND t1.n*t2.n <= 100
GROUP BY t1.n*t2.n
HAVING count(*)=1
ORDER BY 1;
-- Oracle
WITH t(n) AS (
SELECT 1 FROM dual
UNION ALL
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n*t2.n
FROM t t1, t t2
WHERE t1.n <= t2.n AND t1.n*t2.n > 1 AND t1.n*t2.n <= 100
GROUP BY t1.n*t2.n
HAVING count(*)=1
ORDER BY 1;
-- Microsoft SQL Server
WITH t(n) AS (
SELECT 1
UNION ALL
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n*t2.n
FROM t t1, t t2
WHERE t1.n <= t2.n AND t1.n*t2.n > 1 AND t1.n*t2.n <= 100
GROUP BY t1.n*t2.n
HAVING count(*)=1
ORDER BY 1;
原文作者:SQL编程思想;如有侵权,请联系管理员删除。