簡體   English   中英

使用 ROWNUM 在 Oracle 中獲取質數記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM