powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Убрать записи двойники
25 сообщений из 36, страница 1 из 2
Убрать записи двойники
    #39361318
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Зашел в тупик, прошу помощи.
Упрощенная модель задачи. В таблице есть два поля id1 и id2. Записи, в которых id1 || id2 = id2 || id1 считаются "двойниками" и нужно одну из них убрать (любую)

Код: 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.
with s as
 (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 s



Результат

ID1 ID2 1 2 3 4 5 6 2 1 4 3 7 8 9 0

Нужно что бы осталось

ID1 ID2 1 2 3 4 5 6 7 8 9 0
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361326
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorD,
Если не путаю, то отловить их можно так:
Код: sql
1.
2.
3.
SELECT T.ID1, T.ID2,T1.ID1,T1.ID2
FROM TABLEA T
JOIN  TABLEA T1 ON T.ID1=T1.ID2 AND T.ID2=T1.ID1
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361330
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
londinium,
отловить не проблема. У меня был такой вариант

Код: plsql
1.
2.
3.
4.
...
select *
from s
where s.id1 || s.id2  in (select t.id2 || t.id1  from s t )



Нужно убрать по одной записи у двойников, а как, не знаю...
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361338
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
less + group by + min
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361340
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorD,

Нужно вывести уникальную пару select-ом или удалить дубли из таблицы?
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361345
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Нужно построить select таким образом, что бы там не было дублей.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361347
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... т.е. из двух дублирующих строк осталась одна (любая)
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361353
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
select distinct least(id1, id2), greatest(id1, id2)
from s


+ если есть null-ы, то допилишь сам.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361357
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
with s as
 (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 least(id1,id2) a,greatest(id1,id2) b -- ,count(*) c
from s
group by least(id1,id2) ,greatest(id1,id2);

...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361359
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБО!!!
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361361
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
least/greatest сменит ориентацию некоторым бирюкам.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361363
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без смены ориентации
Код: plsql
1.
2.
3.
4.
5.
6.
select id1, id2
from
   (select s.*, row_number() over (partition by least(id1, id2), greatest(id1, id2) order by id1, id2) rn
    from s
   )
where rn = 1;
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361379
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorD
Код: plsql
1.
s.id1 || s.id2

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

это не решение, это подход, который оказался ошибочным. :) Знаю, что так делать нельзя
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361403
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если серьезно, то было так to_char(id1) || ' -' || to_char(id2)
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361517
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-least/greatest сменит ориентацию некоторым бирюкам.

Только если оная присутствует (намек на NULL для тех кто не понял).

SY.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361576
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorDЕсли серьезно, то было так to_char(id1) || ' -' || to_char(id2)Т.е. про expression list не слыхал?
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361795
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicIgorDЕсли серьезно, то было так to_char(id1) || ' -' || to_char(id2)Т.е. про expression list не слыхал?
Не буду лгать - не использовал на практике. Почитал документацию, покрутил с вышеизложенным примером - не получилось.
Буду рад, если выложите рабочий вариант, и я узнаю что-то новое для себя :)
Спасибо.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361805
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorDпокрутилПродемонстрируй.
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361814
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicIgorDпокрутилПродемонстрируй.
Код: plsql
1.
2.
3.
4.
5.
6.
select *
from s 
group by grouping sets
  ((id1, id2),
   (id2, id1)
  )
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39361819
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробуй здесь:IgorD
Код: plsql
1.
where s.id1 || s.id2  in (select t.id2 || t.id1  from s t )
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362076
IgorD,
Может я не понял вопрос, но что мешает написать что-то вроде:
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT * FROM
( запрос к таблице s, возвращающий все "двойники" )
WHERE id1 < id2
UNION ALL
SELECT * FROM
( запрос к таблице s, возвращающий все, кроме "двойников" )
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362181
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorD,

Давайте все-таки определимся 1,1111 и 11,111 это двойники? Я понимаю, что по условиям упрощенной задачи это так, но вдруг в оригинале нет. А может и да... :)
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362380
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,
Двойники считаются те строки в который одинаковые Id, в независимости от их размещения в колонках, т.е.
1 и 1111 двойники с 1111 и 1
...
Рейтинг: 0 / 0
Убрать записи двойники
    #39362384
IgorD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нетянепонял,
Из двойников/тройников/... нужно оставить только одну запись
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Убрать записи двойники
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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