我正试图从我的桌子上获取所有主要(行)编号的记录。有人请说明如何解决这个问题?
以下是我的示例数据。
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运算符?
答案 0 :(得分:8)
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;
如果您不想计算素数,可以从现有数据中添加它们:List of small primes
答案 1 :(得分:1)
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 五 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
答案 2 :(得分:0)
您可以使用以下查询选择所有素数
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)
答案 3 :(得分:0)
可以使用以下内容:
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;
答案 4 :(得分:0)
下面可以列出最多 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;