Oracle SQL Group и сравнить подмножества - PullRequest
0 голосов
/ 24 мая 2018

Рассмотрим следующую таблицу,
+ ----- + ---------- +
|ID |ЗНАЧЕНИЕ |
+ ----- + ---------- +
|1 |A |
|1 |B |
|2 |A |
|2 |B |
|2 |C |
|3 |A |
|3 |C |
|4 |A |
|4 |F |
|4 |B |
+ ----- + ---------- +
Мне нужно получить идентификатор, который имеет все значения в ID = 1;Это означает, что идентификаторы имеют значение A и B (оба) Ожидаемые идентификаторы: 1, 2, 4

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Другим вариантом будет подсчет A и B в группах:

with t (id, value) as (
    select 1, 'A' from dual union
    select 1, 'B' from dual union
    select 2, 'A' from dual union
    select 2, 'B' from dual union
    select 2, 'C' from dual union
    select 3, 'A' from dual union
    select 3, 'C' from dual union
    select 4, 'A' from dual union
    select 4, 'F' from dual union
    select 4, 'B' from dual 
)
select id from t group by id
having sum(decode(value,'A',1,0)) > 0
   and sum(decode(value,'B',1,0)) > 0;
0 голосов
/ 24 мая 2018

Вот один из методов:

select t.id
from t join
     t t1
     on t1.id = 1 and t1.value = t.value
group by t.id
having count(*) = (select count(*) from t where t.id = 1);

Самоподсоединение совпадает со значениями, сохраняя только те строки, которые соответствуют значениям id = 1.having подсчитывает количество совпадений, чтобы увидеть, включены ли все значения для данного id.

...