Как получить уникальные строки на основе комбинации значений двух столбцов - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть таблица, состоящая, скажем, из следующих полей со значениями

STAFFNO NAME DESGN DEPTT SPOUSE_STAFFNO SPOUSE_NAME SPOUSE_DESGN SPOUSE_DEPTT
111111  AAA  AM    HR    999999         PPP         JM           FIN
222222  BBB  DM    MKTG  888888         QQQ         AM           HR
333333  CCC  SM    FIN   777777         RRR         DM           FIN
999999  PPP  JM    FIN   111111         AAA         AM           HR
888888  QQQ  AM    HR    222222         BBB         DM           MTKG
777777  RRR  DM    FIN   333333         CCC         SM           FIN

Мне нужно два запроса SQL в Oracle, чтобы получить список сотрудников вместе с их супругами без повторов строк.Как видно из значений в таблице, запись, представленная в таблице, предназначена для каждого уникального сотрудника, который повторяет запись для супругов.

Мне нужен вывод следующим образом, учитывая список сотрудников, такчто если сведения о супруге присутствуют в отношении какого-либо сотрудника, то не следует повторять то же самое в выходных данных, снова рассматривая супруга в качестве сотрудника.

STAFFNO NAME DESGN DEPTT SPOUSE_STAFFNO SPOUSE_NAME SPOUSE_DESGN SPOUSE_DEPTT
111111  AAA  AM    HR    999999         PPP         JM           FIN
222222  BBB  DM    MKTG  888888         QQQ         AM           HR
333333  CCC  SM    FIN   777777         RRR         DM           FIN

Пожалуйста, предложите код SQL для желаемого результата.Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

0 голосов
/ 25 апреля 2019

Немного странное требование ... потенциально свидетельствует о проблеме дизайна.

with your_data (STAFFNO,NAME,DESGN,DEPTT,SPOUSE_STAFFNO,SPOUSE_NAME,SPOUSE_DESGN,SPOUSE_DEPTT)
as
(select 111111, 'AAA','AM',  'HR',999999,'PPP','JM', 'FIN' from dual union all
 select 222222, 'BBB','DM','MKTG',888888,'QQQ','AM',  'HR' from dual union all
 select 333333, 'CCC','SM', 'FIN',777777,'RRR','DM', 'FIN' from dual union all
 select 999999, 'PPP','JM', 'FIN',111111,'AAA','AM',  'HR' from dual union all
 select 888888, 'QQQ','AM',  'HR',222222,'BBB','DM','MTKG' from dual union all
 select 777777, 'RRR','DM', 'FIN',333333,'CCC','SM', 'FIN' from dual)
select *
from (
select t1.staffno, t1.name, t1.desgn, t1.deptt, t2.staffno spouse_staffno, t2.name spouse_name, t2.desgn spouse_degn, t2.deptt spouse_deptt
,      row_number() over (partition by (coalesce(least(t1.staffno,t2.staffno),t1.staffno)) order by t1.staffno) rn
from   your_data t1
,      your_data t2
where  t2.staffno (+) = t1.spouse_staffno)
where rn = 1;

   STAFFNO NAM DE DEPT SPOUSE_STAFFNO SPO SP SPOU         RN
---------- --- -- ---- -------------- --- -- ---- ----------
    111111 AAA AM HR           999999 PPP JM FIN           1
    222222 BBB DM MKTG         888888 QQQ AM HR            1
    333333 CCC SM FIN          777777 RRR DM FIN           1
0 голосов
/ 25 апреля 2019

С НЕ СУЩЕСТВУЮЩИМ:

select t.* 
from tablename t
where not exists(
  select 1 from tablename 
  where
    STAFFNO < t.STAFFNO
    and 
    STAFFNO = t.SPOUSE_STAFFNO
)
0 голосов
/ 25 апреля 2019

Я не проверял это, но вы можете попробовать что-то вроде этого:

select * from table t where t.STAFFNO = t.SPOUSE_STAFFNO;

0 голосов
/ 25 апреля 2019

Вот один метод, который работает с вашими данными:

select t.*
from t
where t.staffno < t.spouse_staffno;

Однако это предполагает, что все пары находятся в данных. Позвольте мне предположить, что это не так. В этом случае:

select t.*
from t
where t.staffno < t.spouse_staffno
union all
select t.*
from t
where t.staffno > t.spouse_staffno and
      not exists (select 1
                  from t t2
                  where t2.staffno = t.spouse_staffno and
                        t2.spouse_staffno = t.staffno
                 );

Вы также можете сделать это с помощью одного оператора и оконных функций:

select t.*
from (select t.*,
             row_number() over (partition by least(staffno t.spouse_staffno), greatest(staffno,  t.spouse_staffno)
                                order by staffno
                               ) as seqnum
      from t
     ) t
where seqnum = 1;
0 голосов
/ 25 апреля 2019

использовать связанный подзапрос

select distinct t1.* from table t1
where not exists ( select 1 from table t2 where t1.STAFFNO=t2.SPOUSE_STAFFNO)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...