Вероятно, наиболее эффективным методом является использование exists
:
select fr.*
from fruitrating fr
where (fr.rating = 'A' and
exists (select 1 from fruitrating fr2 where fr2.fruit = fr.fruit and fr2.rating = 'B'
)
) or
(fr.rating = 'B' and
exists (select 1 from fruitrating fr2 where fr2.fruit = fr.fruit and fr2.rating = 'A'
)
) ;
Вы можете упростить эту логику c до:
select fr.*
from fruitrating fr
where (fr.rating in ('A', 'B') and
exists (select 1
from fruitrating fr2
where fr2.fruit = fr.fruit and
fr2.rating in ('A', 'B') and
fr2.rating <> fr.rating
)
) ;
Однако это не обобщает так же просто для больших комбинаций.
Если вы просто хотели фрукты, а не ряды, то:
select fruit
from fruitrating
where rating in ('A', 'B')
group by fruit
having count(rating) = 2;
Используйте count(distinct rating)
, если в таблице могут быть дубликаты.