SQL (PLSQL), как выбрать разные, но с количеством> 1 - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть таблица INVOICE с ID_STUFF, STUFF_NAME, E_MAIL столбцами.Мне нужно найти строки, которые имеют тот же ID_STUFF, но разные STUFF_NAME или E_MAIL.

select distinct g.id_stuff, g.staff_name, g.e_mail from invoice g

показывает это: enter image description here

Но мне не нужностроки, имеющие одинаковые значения для одинаковых ID_STUFF.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Предположительно, вы хотите оригинальные строки.Если это так, я бы рекомендовал использовать 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);
0 голосов
/ 01 декабря 2018

Используйте exists, чтобы найти похожие записи:

 select  g.id_stuff, g.staff_name, g.e_mail from invoice g
 where exists 
 (select 1 from invoice g1 where g1.id_stuff =g.id_stuff
  and ( g1.staff_name <> g.staff_name or g1.e_mail <> g.e_mail)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...