Я совсем заработался иди баг( поиск дублей )

Lecter
Дата: 03.12.2009 17:31:52
Выполняю такой скрипт:
select * from bla b1 where b1.rowid NOT IN
(
    select min(b2.rowid) from bla b2
    where b2.gid is not null and b2.id is not null and b2.num is not null and b2.ver is not null    
    group by b2.gid, b2.id, b2.num, b2.ver 
    
)
and b1.gid is not null and b1.id is not null and b1.num is not null and b1.ver is not null

В результате получаю все записи у которых предыдущая версия( ver ) имела одно из полей группировки NULL( gid, id, num ).
Может я уже переработал просто и не соображаю, гляньте свежим взглядом.
Вроде как " where b2.gid is not null and b2.id is not null and b2.num is not null and b2.ver is not null " должно было вообще убрать все нулы, короче я чего то не понимаю.

Версия:
select * from v$version

BANNER                                                          
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production                          
CORE	10.2.0.3.0	Production                                      
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production         
NLSRTL Version 10.2.0.3.0 - Production                          

5 rows selected.

Never again...
dragonx
Дата: 03.12.2009 17:46:30
group by b2.gid, b2.id, b2.num, b2.ver
>получаю все записи у которых предыдущая версия( ver ) имела одно из полей группировки NULL( gid, id, num )

вроде все честно
dragonx
Дата: 03.12.2009 17:56:30
Lecter
Вроде как " where b2.gid is not null and b2.id is not null and b2.num is not null and b2.ver is not null " должно было вообще убрать все нулы

ну оно их и убрало,
а
where b1.rowid NOT IN
эти null опять выбрало
suPPLer
Дата: 03.12.2009 18:05:46
dragonx,

Вы построчно запрос читаете? :) Тогда прочитайте последнюю строку.

Lecter,

если запрос действительно такой же, за исключением названий таблицы и столбцов, то похоже на баг.
Lecter
Дата: 03.12.2009 18:06:25
dragonx,

А второй
and b1.gid is not null and b1.id is not null and b1.num is not null and b1.ver is not null
Не фильтрует их разве? :)
Lecter
Дата: 03.12.2009 18:07:41
suPPLer,

Да такой 100% А ноту часом не подскажите?
orawish
Дата: 03.12.2009 18:15:33
Lecter,

вам и это подойдёт:
select * from bla b1
 where (gid, id, num, ver) not in
(
   select b2.gid, b2.id, b2.num, b2.ver
     from bla b2
 group by b2.gid, b2.id, b2.num, b2.ver 
);
Lecter
Дата: 03.12.2009 18:18:52
orawish,

Каким образом? Видно уже действительно заработался... Ваш запрос ведь выдаст все где есть нулы, а не дубли.. или?!
suPPLer
Дата: 03.12.2009 18:22:06
Lecter,

к сожалению, не подскажу. В плане выполнения всё нормально: с предикатами и вообще? С упорядочиванием/минимумами/максимумами по rowid я бы был очень осторожен... Что, если переписать:

select * 
  from (
select b1.*, row_number() over(partition by b1.gid, b1.id, b1.num, b1.ver order by rowid) rn
  from bla b1
where b1.gid is not null and b1.id is not null and b1.num is not null and b1.ver is not null)
where rn > 1
Lecter
Дата: 03.12.2009 18:25:10
suPPLer,

Тоже самое.