powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Убрать записи двойники
11 сообщений из 36, страница 2 из 2
Убрать записи двойники
    #39362385
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в реальной задаче я решил задачу с помощью решения от AmKad
Код: plsql
1.
row_number() over (partition by least(id1, id2), greatest(id1, id2) order by id1, id2) rn
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362603
IgorD,
ну да, одна запись и остается. Возвращает именно то, что хотелось:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT * FROM
( select *
from s
where s.id1 || s.id2  in (select t.id2 || t.id1  from s t ) )
WHERE id1 < id2
UNION
SELECT * FROM
( select *
from s
where s.id1 || s.id2 not  in (select t.id2 || t.id1  from s t ) )


А "тройники" - это что? О них речи не шло.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362656
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НетянепонялIgorD,
А "тройники" - это что? О них речи не шло.

Имел ввиду любое количество записей с одинаковыми id

И таки да :) - ваш вариант решает задачу
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362658
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorDИ таки да :) - ваш вариант решает задачуНо, как уже намекали, только на ограниченном множестве допустимых значений.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362675
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нетянепонял

Вашу идею преобразил в такой вид и остался доволен :)

Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
with s as
 ( 
  select 1 as id1,
          1 as id2
    from dual
  union all
  select 1 as id1,
          1 as id2
    from dual
  union all
  select 1 as id1,
          2 as id2
    from dual
  union all
  select 1 as id1,
          2 as id2
    from dual
  union all
  select 3 as id1,
          4 as id2
    from dual
  union all
  select 5 as id1,
          6 as id2
    from dual
  union all
  select 2 as id1,
          1 as id2
    from dual
  union all
  select 4 as id1,
          3 as id2
    from dual
  union all
  select 7 as id1,
          8 as id2
    from dual
  union all
  select 9 as id1,
          0 as id2
    from dual)

select *
  from (select *
          from s
         where exists (select ''
                  from s t
                 where t.id2 = s.id1
                   and t.id1 = s.id2))
 where id1 <= id2
 
union

select *
  from (select *
          from s
         where not exists (select ''
                  from s t
                 where t.id2 = s.id1
                   and t.id1 = s.id2))

...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362682
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadIgorDИ таки да :) - ваш вариант решает задачуНо, как уже намекали, только на ограниченном множестве допустимых значений.

Согласен. Меня радует множество вариантов решения задачи и огорчает, что я самостоятельно не нашел ни одного )
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362695
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НетянепонялIgorD,
ну да, одна запись и остается. Возвращает именно то, что хотелось :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT * FROM
( select *
from s
where s.id1 || s.id2  in (select t.id2 || t.id1  from s t ) )
WHERE id1 < id2
UNION
SELECT * FROM
( select *
from s
where s.id1 || s.id2 not  in (select t.id2 || t.id1  from s t ) )


А "тройники" - это что? О них речи не шло.

Код: 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.
  1  with s as(
  2  select 11111 id1,1 id2 from dual union all
  3  select 1 id1,11111 id2 from dual union all
  4  select 1111 id1,11 id2 from dual union all
  5  select 111 id1,111 id2 from dual union all
  6  select 111 id1,111 id2 from dual union all
  7  select 33 id1,33 id2 from dual union all
  8  select 33 id1,33 id2 from dual union all
  9  select 333 id1,3 id2 from dual union all
 10  select 11 id1,1111 id2 from dual
 11  )
 12  SELECT * FROM
 13  ( select *
 14  from s
 15  where s.id1 || s.id2  in (select t.id2 || t.id1  from s t ) )
 16  WHERE id1 < id2
 17  UNION
 18  SELECT * FROM
 19  ( select *
 20  from s
 21* where s.id1 || s.id2 not  in (select t.id2 || t.id1  from s t ) )
SQL> /

       ID1        ID2
---------- ----------
         1      11111
        11       1111



....
stax
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362715
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

авторs.id1 || s.id2 - это не решение, это подход. Тут главное идея. А в реальной задаче лучше использовать или exists или в крайнем случае s.id1 || '-' || s.id2
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362720
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorDА в реальной задаче лучше использовать или existsСчитал, сколько обращений к таблице выполняет оптимизатор этом случае?
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362730
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

в своей задаче я остановился на применение аналитической функции row_number().
А вот с exists действительно надо бы проверить. Не задумывался.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362786
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorDAmKadпропущено...
Но, как уже намекали, только на ограниченном множестве допустимых значений.

Согласен. Меня радует множество вариантов решения задачи и огорчает, что я самостоятельно не нашел ни одного )

мой варіант (мож уже и было)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  1  with s as(
  2  select 11111 id1,1 id2 from dual union all
  3  select 1 id1,11111 id2 from dual union all
  4  select 1111 id1,11 id2 from dual union all
  5  select 111 id1,111 id2 from dual union all
  6  select 111 id1,111 id2 from dual union all
  7  select 33 id1,33 id2 from dual union all
  8  select 33 id1,33 id2 from dual union all
  9  select 333 id1,3 id2 from dual union all
 10  select 11 id1,1111 id2 from dual
 11  )
 12  select min(id1) i1,max(id2) i2 from s
 13* group by least(id1,id2), greatest(id1,id2)
SQL> /

        I1         I2
---------- ----------
        33         33
       333          3
        11       1111
         1      11111
       111        111



.....
stax
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Убрать записи двойники
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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