powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как удалить дубликат
15 сообщений из 15, страница 1 из 1
Как удалить дубликат
    #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
Как удалить дубликат
    #40095716
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x17.mstu,

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

SY.
...
Рейтинг: 0 / 0
Как удалить дубликат
    #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
Как удалить дубликат
    #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
Как удалить дубликат
    #40095782
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm


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


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



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


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

Код: plsql
1.
2.
delete from table
 where [условия отбора] and rowid != (select min (rowid) from table where [условия отбора] group by [условия отбора])
...
Рейтинг: 0 / 0
Как удалить дубликат
    #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
Как удалить дубликат
    #40095883
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm


Работает.

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


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

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


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


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

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

....
stax
...
Рейтинг: 0 / 0
Как удалить дубликат
    #40100155
dimyaz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По последнему столбцу не понятно. Это опечатка с точкой и там всегда число, или может быть рандомный текст со всякими символами, из которого надо изъять какое-то число?
...
Рейтинг: 0 / 0
Как удалить дубликат
    #40100305
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyaz, опечатка - везде число
...
Рейтинг: 0 / 0
Как удалить дубликат
    #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
Как удалить дубликат
    #40100396
ded-mazay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rowidtochar(rowid)
?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как удалить дубликат
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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