Вы можете использовать not exists
, но быстрее добавить условную count()
проверку, совпадают ли суммы (во всем окне). Если это число <> 0, удалите строку из выходных данных.
select reg, dist, pkey, n_code, s17, s18
from (
select t.reg, t.dist, t.pkey, t.n_code, t.sum as s17, s.sum as s18,
count(case when t.sum = s.sum then 1 end)
over (partition by t.pkey, t.reg, t.dist, t.n_code) cnt_same
from table1 t
join (select * from table2 t where t.pkey is not null) s
on t.pkey = s.pkey and t.reg = s.reg and t.dist = s.dist and t.n_code = s.n_code
where t.a = 99 and s.a != 99 and t.n_code= 66
and t.sum > 0 and t.reg= 33 and t.dist = 1)
where cnt_same = 0
dbfiddle demo
Эта часть важна :
over (partition by t.pkey, t.reg, t.dist, t.n_code)
Определяет, в каком диапазоне мы проверяем суммы. Если вы хотите отсканировать всю таблицу, используйте:
over ()
, если вы хотите использовать только одну и ту же кнопку pkey
over (partition by t.pkey)