Предположительно, вы хотите оригинальные строки.Если это так, я бы рекомендовал использовать exists
дважды :
select i.*
from invoice i
where exists (select 1
from invoice i2
where i2.id_stuff = i.id_stuff and
i2.staff_name <> i.staff_name
) or
exists (select 1
from invoice i2
where i2.id_stuff = i.id_stuff and
i2.e_mail <> i.e_mail
) ;
В запросе могут использоваться индексы invoice(id_stuff, e_mail)
и invoice(id_stuff, staff_name)
- что было бы большой производительностьювыиграть на большом столе.
Если вы просто хотите id_stuff
, то group by
- это хорошее решение.Вы можете получить список имен и адресов электронной почты, используя listagg()
:
select i.id_stuff,
listagg(e_mail, ',') within group (order by e_mail),
listagg(staff_name, ',') within group (order by staff_name)
from invoice i
group by i.id_stuff
having min(e_mail) <> max(e_email) or
min(staff_name) <> max(staff_name);