В обоих случаях вам нужно group by gadget_id
.
Для 1-го случая условие состоит в том, что оба 1 и 2 должны существовать:
select * from tablename
where gadget_id in (
select gadget_id
from tablename
where widget_id in (1, 2)
group by gadget_id
having count(distinct widget_id) = 2
)
Для 2-го случая условие состоит в том, что 1 не должно существовать:
select * from tablename
where gadget_id in (
select gadget_id
from tablename
where widget_id in (1, 2)
group by gadget_id
having sum(widget_id = 1) = 0
)
Если 1 и 2 являются единственными значениями в столбце widget_id
, вы можете опустить условие:
where widget_id in (1, 2)
в обоих запросах.
См. демоверсию .
Результаты:
Запрос № 1
| gadget_id | widget_id |
| --------- | --------- |
| 101 | 1 |
| 101 | 2 |
| 104 | 1 |
| 104 | 2 |
Запрос № 2
| gadget_id | widget_id |
| --------- | --------- |
| 103 | 2 |
| 105 | 2 |