Получить записи простых чисел в Oracle, используя ROWNUM - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь получить все первоочередные (пронумерованные) записи из моей таблицы. Кто-нибудь может пролить свет на то, как решить эту проблему?

Вот мои примеры данных, как показано ниже.

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?

Ответы [ 3 ]

8 голосов
/ 29 марта 2012

Сито Эратосфена

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;

Если вы не хотите вычислять простые числа, вы можете добавить их из существующих данных: Список небольших простых чисел

1 голос
/ 23 мая 2017
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

0 голосов
/ 29 марта 2012

Вы можете использовать следующий запрос, чтобы выбрать все простые числа

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...