Puede hacer esto agregando las ID en una matriz y luego compárela con la lista de ID previstas:
select v.*
from venues v
join amenity_venue av ON av.venue_id = v.id
group by v.id
having array_agg(av.amenity_id) @> array['aaa', 'bbb'];
Lo anterior asume que venue.id
se declara como la clave principal (debido al group by
).
Realmente no necesita codificar los ID en la consulta si solo desea pasar los nombres de servicios:
select v.*
from venues v
join amenity_venue av ON av.venue_id = v.id
group by v.id
having array_agg(av.amenity_id) @> array(select id
from amenities
where name in ('first amenity', 'second amenity'));
Ejemplo en línea:https://rextester.com/FNNVXO34389