Создадим таблицу и заполним ее данными:
create table KK_XX(name varchar2(30), dt date, val number);
insert into KK_XX(name, dt, val) values('Красный', to_date('07.08.2011','dd.mm.yyyy'), 123);
insert into KK_XX(name, dt, val) values('Красный', to_date('17.11.2011','dd.mm.yyyy'), 513425);
insert into KK_XX(name, dt, val) values('Красный', to_date('19.02.2012','dd.mm.yyyy'), 3245);
insert into KK_XX(name, dt, val) values('Cиний', to_date('07.08.2011','dd.mm.yyyy'), 879);
insert into KK_XX(name, dt, val) values('Cиний', to_date('07.08.2011','dd.mm.yyyy'), 932);
insert into KK_XX(name, dt, val) values('Зеленый', to_date('07.08.2011','dd.mm.yyyy'), 89123);
insert into KK_XX(name, dt, val) values('Зеленый', to_date('05.09.2011','dd.mm.yyyy'), 89210);
insert into KK_XX(name, dt, val) values('Зеленый', to_date('05.09.2011','dd.mm.yyyy'), 6365);
Проведем удаление:
DELETE FROM KK_XX
WHERE (NAME, DT) NOT IN (SELECT NAME, MAX(DT) FROM KK_XX GROUP BY NAME);
Проверим результат:
select * from KK_XX;
Замена exists/not exists на left join + rowid.
Создадим таблицу - справочник цветов - и заполним ее данными (поле NAME - уникально):
create table KK_COLORS(name varchar2(30));
insert into KK_COLORS(name) values ('Серый');
insert into KK_COLORS(name) values ('Зеленый');
insert into KK_COLORS(name) values ('Красный');
insert into KK_COLORS(name) values ('Черный');
Тогда запрос с "exists"
select KK_XX.*
from KK_XX
where exists (select 1 from KK_COLORS where KK_XX.NAME = KK_COLORS.NAME);
можно переписать на запрос с "left join" и "rowid is not null"
select KK_XX.*
from KK_XX
left join KK_COLORS
on KK_XX.NAME = KK_COLORS.NAME
where KK_COLORS.rowid is not null;
А запрос с "not exists"
select KK_XX.*
from KK_XX
where not exists (select 1 from KK_COLORS where KK_XX.NAME = KK_COLORS.NAME);
можно переписать на запрос с "left join" и "rowid is null"
select KK_XX.*
from KK_XX
left join KK_COLORS
on KK_XX.NAME = KK_COLORS.NAME
where KK_COLORS.rowid is null;
Способы с "left join" и "rowid" зачастую работают быстрее, поэтому на практике стоит пробовать их использование.