Поскольку вы не опубликовали свою структуру БД, я сделал несколько предположений и упрощений (относительно столбца rating
, который, вероятно, является числом, а не символьным полем). Отрегулируйте соответственно.
Решение 1. Использование соединений
select distinct e.EmployeeId, e.Name
from employee e
left join reviews r1 on e.EmployeeId = r1.EmployeeId and r1.rating = 'good'
left join reviews r2 on e.EmployeeId = r2.EmployeeId and r1.rating = 'bad'
where r1.ReviewId is not null --meaning there's at least one
and r2.ReviewId is null --meaning there's no bad review
Решение 2. Группировка по и фильтрация с условным подсчетом
select e.EmployeeId, max(e.Name) Name
from employee e
left join reviews r on e.EmployeeId = r.EmployeeId
group by e.EmployeeId
having count(case r.rating when 'good' then 1 else null end) > 0
and count(case r.rating when 'bad' then 1 else null end) = 0
Оба решения совместимы с SQL ANSI, что означает, что оба работают с любой разновидностью RDBMS, которая полностью поддерживает стандарты SQL ANSI (что справедливо для большинства RDBMS).
Как указал @onedaywhen, код не будет работать в MS Access (не проверял, я доверяю его опыту в этой области).
Но у меня есть одно высказывание по этому поводу (которое может расстроить некоторых людей): я вряд ли рассматриваю MS Access как RDBMS. Я работал с этим в прошлом. Как только вы продолжаете (Oracle, SQL Server, Firebird, PostGreSQL, MySQL, вы называете это), вы никогда не захотите возвращаться. Серьезно.