(Одна таблица) получить строки без объединения - PullRequest
2 голосов
/ 21 мая 2019

Извините за название, я просто не знаю, как объяснить, чего я хочу добиться вкратце. Но на самом деле все просто.

У меня есть следующая таблица egr:

+---------+------------+
|  offid  |  groupid   |
+---------+------------+
|       1 | 101        |
|       1 | 202        |
|       2 | 202        |
|       2 | 404        |
+---------+------------+

Я хотел бы получить строки, для которых groupid не связан с другим offid. Результат будет:

+---------+------------+
|  offid  |  groupid   |
+---------+------------+
|       1 | 101        |
|       2 | 404        |
+---------+------------+

Это работает, но мне было интересно, есть ли более элегантный способ сделать это?

select * from egr as egr1
where egr1.offid = 1
and egr1.groupid not in (select groupid from egr as egr2 where egr2.offid = 2 and egr1.groupid = egr2.groupid)
union
select * from egr as egr1
where egr1.offid = 2
and egr1.groupid not in (select groupid from egr as egr2 where egr2.offid = 1 and egr1.groupid = egr2.groupid)

Если вы хотите попробовать:

create table egr (offid int, groupid int);
insert into egr values (1, 101), (1, 202), (2, 202), (2, 404);

Спасибо

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Это то, что вы хотите?

select e.*
from egr e
where not exists (select 1
                  from egr e2
                  where e2.groupid = e.groupid and e2.offid <> e.offid 
                 );

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

select e.*
from egr e
where e.offid in (1, 2) and
      not exists (select 1
                  from egr e2
                  where e2.groupid = e.groupid and 
                        e2.offid in (1, 2) and
                        e2.offid <> e.offid 
                 );
1 голос
/ 21 мая 2019

Использование count()..over().

select groupid,offid
from (select groupid,offid,count(*) over(partition by groupid) as cnt
      from tbl
     ) t
where cnt = 1
0 голосов
/ 21 мая 2019

Это должно сделать это

select groupid from egr group by groupid having count(distinct offid) =1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...