Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как удалить дубликат / 15 сообщений из 15, страница 1 из 1
07.09.2021, 13:00
    #40095714
x17.mstu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
Как удалить дубликат - есть три строки и три столбца
Оставить 1 и 3 или 2 и 3
Кто предложит лучшее решение?


a b c
India USA 10000

a b c
USA India 10.000

a b c
India Sri=Lanls 10.000
...
Рейтинг: 0 / 0
07.09.2021, 13:07
    #40095716
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
x17.mstu,

Контекст потеряли. Я вижу тут три разных строки.
...
Рейтинг: 0 / 0
07.09.2021, 15:11
    #40095760
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
LEAST/GREATEST.

SY.
...
Рейтинг: 0 / 0
07.09.2021, 15:31
    #40095763
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
Как обычно, задача описана для телепатов с хрустальным шаром.

Вероятно , надо обеспечить уникальность первой и второй колонки, причем с перестановкой.

Для двух колонок подряд решение очевидно. С перестановкой сходу не придумал.

Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
Connected to Oracle Database 10g Release 10.2.0.3.0 
Connected as system@ORCL

SQL> create table test(country1 varchar2(200) not null, country2 varchar2(200) not null);

Table created


SQL> create unique index IND1 on test(upper(country1), upper(country2));

Index created


SQL> insert into test values ('India', 'USA');

1 row inserted


SQL> insert into test values ('India', 'usa');
insert into test values ('India', 'usa')

ORA-00001: нарушено ограничение уникальности (SYSTEM.IND1)

SQL> drop index IND1;
Warning: connection was lost and re-established

Index dropped


SQL> insert into test values ('India', 'usa');

1 row inserted


SQL> select * from test;

COUNTRY1                                                                         COUNTRY2
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
India                                                                            usa

SQL> insert into test values ('India', 'USA');

1 row inserted


SQL> commit;

Commit complete


SQL> select * from test;

COUNTRY1                                                                         COUNTRY2
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
India                                                                            usa
India                                                                            USA

SQL> select upper(country1), upper(country2), count(1) from test group by upper(country1), upper(country2);

UPPER(COUNTRY1)                                                                  UPPER(COUNTRY2)                                                                    COUNT(1)
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------
INDIA                                                                            USA                                                                                       2

SQL> select country1, country2, count(1) from test group by country1, country2;

COUNTRY1                                                                         COUNTRY2                                                                           COUNT(1)
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------
India                                                                            usa                                                                                       1
India                                                                            USA                                                                                       1

SQL> delete from test where rowid in (select min(rowid) from test group by country1, country2 having count(1) > 1);
Warning: connection was lost and re-established

0 rows deleted


SQL> delete from test where rowid in (select min(rowid) from test group by upper(country1), upper(country2) having count(1) > 1);

1 row deleted


SQL> select * from test;

COUNTRY1                                                                         COUNTRY2
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
India                                                                            USA

SQL> drop table test;

Table dropped


SQL> 

...
Рейтинг: 0 / 0
07.09.2021, 16:00
    #40095776
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
dmdmdm


Для двух колонок подряд решение очевидно. С перестановкой сходу не придумал.



точно была темка для трех, четырех и тд

вот ето не понял
авторdelete from test where rowid in (select min(rowid) from test group by country1, country2 having count(1) > 1);
?

.....
stax
...
Рейтинг: 0 / 0
07.09.2021, 16:21
    #40095782
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
dmdmdm


Вероятно , надо обеспечить уникальность первой и второй колонки, причем с перестановкой.


Код: plsql
1.
CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(UPPER(LEAST(A,B)),UPPER(GREATEST(A,B)));



SY.
...
Рейтинг: 0 / 0
07.09.2021, 18:21
    #40095811
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
SY
вот ето не понял


Это для случая "удалить одну из двух строк". Понятно, что в общем случае надо

Код: plsql
1.
2.
delete from table
 where [условия отбора] and rowid != (select min (rowid) from table where [условия отбора] group by [условия отбора])
...
Рейтинг: 0 / 0
07.09.2021, 18:35
    #40095817
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
SY

Код: plsql
1.
CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(UPPER(LEAST(A,B)),UPPER(GREATEST(A,B)));




Работает.

Код: 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.
Connected to Oracle Database 10g Release 10.2.0.3.0 
Connected as system@ORCL

SQL> create table test(country1 varchar2(200) not null, country2 varchar2(200) not null);

Table created


SQL> CREATE UNIQUE INDEX INDEX_NAME ON TEST(UPPER(LEAST(COUNTRY1,COUNTRY2)),UPPER(GREATEST(COUNTRY1,COUNTRY2)));

Index created


SQL> insert into test values ('Russia', 'Usa');

1 row inserted


SQL> insert into test values ('Usa', 'Russia');
insert into test values ('Usa', 'Russia')

ORA-00001: нарушено ограничение уникальности (SYSTEM.INDEX_NAME)

SQL> 



Это для задачи "не допускать такое". А задачу "удалить такое" оставим автору, если вы не против, для тренировки мозгов.
...
Рейтинг: 0 / 0
08.09.2021, 10:17
    #40095883
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
dmdmdm


Работает.

Это для задачи "не допускать такое". А задачу "удалить такое" оставим автору, если вы не против, для тренировки мозгов.


задачу докрутить с null оставим автору?

.....
stax
...
Рейтинг: 0 / 0
08.09.2021, 12:45
    #40095942
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
Stax
оставим автору?


Тут авторы и авторки такие, что их надо оставить лет на пять поработать самостоятельно.
...
Рейтинг: 0 / 0
08.09.2021, 16:48
    #40096062
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
dmdmdm
Stax
оставим автору?


Тут авторы и авторки такие, что их надо оставить лет на пять поработать самостоятельно.

имхо
если null допустимы и для поля нет "недопустимого значения" , то придется поработать

....
stax
...
Рейтинг: 0 / 0
27.09.2021, 11:10
    #40100155
dimyaz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
По последнему столбцу не понятно. Это опечатка с точкой и там всегда число, или может быть рандомный текст со всякими символами, из которого надо изъять какое-то число?
...
Рейтинг: 0 / 0
27.09.2021, 18:40
    #40100305
x17.mstu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
dimyaz, опечатка - везде число
...
Рейтинг: 0 / 0
28.09.2021, 09:07
    #40100384
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
x17.mstu
dimyaz, опечатка - везде число

чем Вам не подходит?

delete from test where rowid NOT in (
select min(rowid) from test group by least(a,b),greatest(a,b))

ps
upper/lover добавить, если без учета регистра

.....
stax
...
Рейтинг: 0 / 0
28.09.2021, 10:25
    #40100396
ded-mazay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить дубликат
rowidtochar(rowid)
?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как удалить дубликат / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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