powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL команда
7 сообщений из 7, страница 1 из 1
SQL команда
    #32131784
_no_name_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно одним sql-оператором удалить из таблицы
create table tb_test (
val integer,
str varchar2(10)
);
все дублирующиеся вхождения val , так чтобы оставить по одному вхождению.
Это чисто теоретическая задача. И еще. Таже задача только без столбца str.
...
Рейтинг: 0 / 0
SQL команда
    #32131821
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
SQLWKS> create table tb_test as select owner,table_name from all_tables
      2 > 
Предложение обработано.

SQLWKS> select 
      2 > owner, count(*)
      3 > from
      4 > tb_test
      5 > group by owner
      6 > 
OWNER                          COUNT(*)  
 ------------------------------ ----------
 
SYS                                      6 
SYSTEM                                   1 
Выбрано  2  строк.

SQLWKS> select 
      2 > *
      3 > from
      4 > tb_test
      5 > 
OWNER                          TABLE_NAME                    
 ------------------------------ ------------------------------
 
SYS                            DUAL                          
SYS                            SYSTEM_PRIVILEGE_MAP          
SYS                            TABLE_PRIVILEGE_MAP           
SYS                            STMT_AUDIT_OPTION_MAP         
SYS                            AUDIT_ACTIONS                 
SYS                            PSTUBTBL                      
SYSTEM                         DEF$_TEMP$LOB                 
Выбрано  7  строк.


SQLWKS> delete tb_test b where b.rowid not in (
      2 > select 
      3 > a.rowid
      4 > from
      5 > tb_test a
      6 > where
      7 >  a.rowid = (select min(rowid) from tb_test where owner = a.owner)
      8 > )
      9 > 
Обработано  4  строк.

SQLWKS> select 
      2 > *
      3 > from
      4 > tb_test
      5 > 
OWNER                          TABLE_NAME                    
 ------------------------------ ------------------------------
 
SYS                            DUAL                          
SYSTEM                         DEF$_TEMP$LOB                 
Выбрано  2  строк.


Итого, запрос такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
delete tb_test b where b.rowid not in (
select 
a.rowid
from
tb_test a
where
 a.rowid = (select min(rowid) from tb_test where owner = a.owner)
)
...
Рейтинг: 0 / 0
SQL команда
    #32131919
olga1999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delete from mz.tb_test b
where b.val in (select a.val from mz.tb_test a where ((a.val=b.val) and (a.str>b.str)))

Это если есть столбец str

delete from mz.tb_test a
where (select count(*) from mz.tb_test b where b.val=a.val)<>1

Это если этого столбца нет.
...
Рейтинг: 0 / 0
SQL команда
    #32131933
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
delete from mz.tb_test b 
where b.val in (select a.val from mz.tb_test a where ((a.val=b.val) and (a.str>b.str))) 

"a.str>b.str"
А вы подумали,что будет если в таблице значения столбца str будет совпадать?

Код: plaintext
1.
2.
delete from mz.tb_test a 
where (select count(*) from mz.tb_test b where b.val=a.val)<> 1 

В этом случае у вас удалятся все записи для тех записей для которых val повторяется.
...
Рейтинг: 0 / 0
SQL команда
    #32131952
Фотография hinotf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а разве не

delete dup_emp
where rowid not in
(
select max(rowid)
from dup_emp
group by empno, ename, job, mgr, hiredate, sal, comm, deptno
);

соответственно в gruop by перечисляется сочетание столбцов, уникальность которых надо остлеживать. Этот пример приводится вроде ещё в стандартном оракловском круса по SQL
...
Рейтинг: 0 / 0
SQL команда
    #32131980
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда встаёт вопрос, что быстрее будет выполняться:
Код: plaintext
1.
select min(rowid) from tb_test where owner = a.owner

или
Код: plaintext
1.
select max(rowid) from dup_emp group by owner
...
Рейтинг: 0 / 0
SQL команда
    #32132061
_no_name_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таком случае можно и так
DELETE FROM tb_test WHERE (val,str) IN
(
SELECT val,str FROM (
SELECT VAL,STR,FIRST_VALUE(STR)
OVER (PARTITION BY val) str_dop
FROM tb_test WHERE val IN
( SELECT a.val
FROM tb_test a
GROUP BY a.val
HAVING COUNT(a.val)>1
)
) WHERE str<>str_dop
)
если str заменить на rowid. Понятно , что это дольше, но проблема в том , что хотелось бы это сделать без ROWID. Кажется это невозможно, тогда надо этот вопрос задать MSSQL форуме.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL команда
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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