powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
14 сообщений из 14, страница 1 из 1
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966335
Нашел запросом группы дубликатов в таблице CLIENT по полю INN и этим же запросом нашел их состав. Как теперь следующим запросом в конструкции WITH извлечь всех клиентов-дубликатов из всех групп вместе с их общим значением INN?
Вот так работает, но очень медленно работает второй запрос, со сканированием таблицы CLIENT. Как нибудь можно ускорить, может при помощи конструкции TABLE как-то? Вариант с отбором клиентов во втором запросе тоже по INN равному INN группы не подходит, так как это упрощенный пример, в реальности на отбор клиентов навешано еще много дополнительных условий. Они уже проверены в первом запросе и проверять их снова во втором запросе не хотелось бы. Хотелось бы как-то извлечь те ID клиентов, которые уже отобраны в поле CLS первого запроса.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with grps as
(select cl.inn inn,
          cast(collect(cl.id) as type_number_table) cls,
          count(*) cnt
    from client cl
    group by cl.inn
    having count(*) > 1
)
select gr.inn inn,
         cl.id id
   from grps gr, client cl
   where cl.id member of gr.cls
   order by 1
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966357
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадий Шторм,

сначала зачем-то свернули в cls, теперь хочете развернуть обратно?

.....
stax
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966366
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадий Шторм,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
  1  with grps as
  2  (select job inn,
  3           cast(collect(cast(empno as int)) as ane_num_table) cls,
  4            count(*) cnt
  5      from emp cl
  6      group by job
  7      having count(*) > 1
  8  )
  9  select inn,
 10           cl.empno id
 11     from grps gr, emp cl
 12     where cast(cl.empno as int) member of gr.cls
 13*    order by 1
SQL> /

INN               ID
--------- ----------
ANALYST         7788
ANALYST         7902
CLERK           7369
CLERK           7876
CLERK           7900
CLERK           7934
MANAGER         7566
MANAGER         7782
MANAGER         7698
SALESMAN        7499
SALESMAN        7654
SALESMAN        7521
SALESMAN        7844

13 rows selected.


SQL> desc ane_num_table
 ane_num_table TABLE OF NUMBER



что не так?


зы
совсем не понятно зачем from grps gr, emp cl
.....
stax
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966399
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия сервера-то какая?
...вот так попробуйте.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with grps as
(select cl_id
   from (select cl.id cl_id
              , count(*) over(partition by cl.inn) cnt
           from client cl) x
  where x.cnt > 1
)
select gr.inn inn,
         cl.id id
  from grps gr, client cl
 where cl.id = gr.cl_id
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966415
Эту версию запроса я тоже пробовал использовать, она тоже работает долго. Версия Oracle 18c Enterprise Edition
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966417
Stax, Cвернул, чтобы отбросить тех клиентов, что не являются дубликатами
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966420
Stax

что не так?


зы
совсем не понятно зачем from grps gr, emp cl
.....
stax


Все так, мой запрос работает, но вторая часть запроса во много раз дольше, чем первая. Хотя первая основную работу сделала.
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966425
Так все-таки, есть такая конструкция, которая позволяет собирать значения из реквизита-коллекции? Что нибудь типа multiset union distinct, только агрегирующая.
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966427
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадий Шторм
Эту версию запроса я тоже пробовал использовать, она тоже работает долго. Версия Oracle 18c Enterprise Edition


Сорри, я был совсем невнимательным.
Код: plsql
1.
2.
3.
4.
5.
select inn, id
   from (select inn, cl.id 
              , count(*) over(partition by cl.inn) cnt
           from client cl) x
  where x.cnt > 1
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966429
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадий Шторм
Так все-таки, есть такая конструкция, которая позволяет собирать значения из реквизита-коллекции? Что нибудь типа multiset union distinct, только агрегирующая.

Поясните что имеете ввиду.
Что значит "собирать из коллекции", "только агрегирующая".
Если Вам надо развернуть коллекцию обратно в строки, то это делается право-ассоциативным соединением.
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966431
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
право-ассоциативным соединением.

лево-коррелированным :)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (select rownum id, mod(rownum,4) inn from dual connect by level < 7)
, t1 as ( select inn, cast(collect(id) as sys.odcinumberlist) coll
          from t
          group by inn having count(*) > 1
        )
select t.inn, coll.column_value
from t1 t, table(t.coll) coll
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966442
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадий Шторм
она тоже работает долго.


не совсем понятно что Вам надо

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SQL> ed
Wrote file afiedt.buf

  1  with grps as
  2  (select job inn,
  3           cast(collect(cast(empno as int)) as sys.odcinumberlist) cls,
  4            count(*) cnt
  5      from emp cl
  6      group by job
  7      having count(*) > 1
  8  )
  9  select inn,
 10           value(v) cl_id
 11     from grps gr, table(cls) v
 12* order by 1
SQL> /

INN            CL_ID
--------- ----------
ANALYST         7788
ANALYST         7902
CLERK           7369
CLERK           7934
CLERK           7900
CLERK           7876
MANAGER         7566
MANAGER         7698
MANAGER         7782
SALESMAN        7499
SALESMAN        7654
SALESMAN        7844
SALESMAN        7521

13 rows selected.



дубликаты по job
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
  1  select * from
  2   (select
  3      e.*
  4     ,count(*) over (partition by job) cc
  5     from emp e)
  6* where cc>1
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO         CC
---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 09.12.1982       3000                    20          2
      7902 FORD       ANALYST         7566 03.12.1981       3000                    20          2
      7934 MILLER     CLERK           7782 23.01.1982       1300                    10          4
      7900 JAMES      CLERK           7698 03.12.1981        950                    30          4
      7369 SMITH      CLERK           7902 17.12.1980        800                    20          4
      7876 ADAMS      CLERK           7788 12.01.1983       1100                    20          4
      7698 BLAKE      MANAGER         7839 01.05.1981       2850                    30          3
      7566 JONES      MANAGER         7839 02.04.1981       2975                    20          3
      7782 CLARK      MANAGER         7839 09.06.1981       2450                    10          3
      7844 TURNER     SALESMAN        7698 08.09.1981       1500                    30          4
      7654 MARTIN     SALESMAN        7698 28.09.1981       1250       1400         30          4
      7521 WARD       SALESMAN        7698 22.02.1981       1250        500         30          4
      7499 ALLEN      SALESMAN        7698 20.02.1981       1600        300         30          4

13 rows selected.



.....
stax
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966506
andrey_anonymous

select t.inn, coll.column_value
from t1 t, table(t.coll) coll


А такая конструкция точно работает в одном списке источников FROM? Что то у меня не захотела. Попробую еще завтра
...
Рейтинг: 0 / 0
Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
    #39966531
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадий Шторм
andrey_anonymous

select t.inn, coll.column_value
from t1 t, table(t.coll) coll

А такая конструкция точно работает в одном списке источников FROM? Что то у меня не захотела. Попробую еще завтра

Точно работает еще с 8i, если склероз не изменяет.
Только для решения задачи дедубликации оно не требуется.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как собрать одним запросом дубликаты после формирования групп дубликатов в этом же запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]