[英]Get Prime Number records in Oracle using ROWNUM
我正在嘗試從我的表中獲取所有素數(行)編號的記錄。有人可以解釋一下如何解決這個問題嗎?
這是我的示例數據如下。
EMPID EMPNAME
1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
10 J
所需輸出:
EMPID EMPNAME
2 B
3 C
5 E
7 G
如果我有大量數據,如何獲得這樣的輸出而不是使用 IN 運算符?
CREATE TABLE primes (
num number PRIMARY KEY
);
INSERT INTO primes (num)
SELECT LEVEL + 1
FROM dual
CONNECT BY LEVEL < 1000;
DELETE FROM primes p1
WHERE EXISTS (
SELECT NULL
FROM primes p2
WHERE p2.num < p1.num
AND MOD(p1.num, p2.num) = 0
);
接着
SELECT emps.*
FROM emps
INNER JOIN primes ON primes.num = emps.EMPID;
要么
SELECT EMPID, EMPNAME
FROM (
SELECT ROWNUM AS rn, emps.EMPID, emps.EMPNAME
FROM emps
)
INNER JOIN primes ON primes.num = rn;
如果您不想計算素數,可以從現有數據中添加它們:小素數列表
select l prime_number
from (select level l from dual connect by level <= 100)
, (select level m from dual connect by level <= 100)
-- where m<=l --this doesnt matter but including it will perform better
group by l
having count(case l/m when trunc(l/m) then 1 end) in (1,2)
order by l;
PRIME_NUMBER 1 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
可以使用以下內容:
with lvl as
(
select level l from dual connect by level<=100
), unprime as(select l2.* from lvl l1,lvl l2 where l1.l<l2.l and mod(l2.l,l1.l)=0 and l1.l>1)
select lvl.l from lvl where l>1
minus select l from unprime;
下面可以列出最多 10 個的質數。 然后加入您在 EMPID 上的數據。
(SELECT LEVEL P FROM DUAL CONNECT BY ROWNUM<=10)
MINUS
(SELECT T1.P FROM
(SELECT LEVEL P FROM DUAL CONNECT BY ROWNUM<=10) T1 JOIN
(SELECT LEVEL D FROM DUAL CONNECT BY ROWNUM<=10) T2 ON mod(T1.P,T2.D)=0 AND T1.P>T2.D
AND T2.D>1
)
MINUS (SELECT 1 FROM DUAL);
假設您的表名是 EMP:
WITH EMP AS
(
SELECT 1 EMPID, 'A' EMPNAME FROM DUAL
UNION ALL
SELECT 2 EMPID, 'B' EMPNAME FROM DUAL
--etc.
)
SELECT EMP.* FROM
(
(SELECT LEVEL P FROM DUAL CONNECT BY ROWNUM<=10)
MINUS
(SELECT T1.P FROM
(SELECT LEVEL P FROM DUAL CONNECT BY ROWNUM<=10) T1 JOIN
(SELECT LEVEL D FROM DUAL CONNECT BY ROWNUM<=10) T2 ON mod(T1.P,T2.D)=0 AND T1.P>T2.D
AND T2.D>1
)
MINUS (SELECT 1 FROM DUAL)
) T1,EMP WHERE T1.P=EMP.EMPID;
您可以使用以下查詢來選擇所有質數
SQL> select l prime_number
2 from (select level l from dual connect by level <= 100)
3 , (select level m from dual connect by level <= 100)
4 where m<=l
5 group by l
6 having count(case l/m when trunc(l/m) then 'Y' end) = 2
7 order by l
8 /
PRIME_NUMBER
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
或者這個:
SQL> with t as (select level l from dual connect by level <= 100)
2 --
3 SELECT l prim_num FROM
4 (select * from t
5 model
6 dimension by (l dim)
7 measures (l,2 temp)
8 rules iterate (1000000) until (power(temp[1],2)>100)
9 (l[DIM>TEMP[1]]=decode(mod(l[CV()],temp[1]),0,null,l[CV()]),
10 temp[1]=min(l)[dim>temp[1]])
11 )
12 WHERE l IS NOT NULL
13 /
然后就這樣做:
Select *
from myTable
where ROWNUM in (query)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.