PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verbinden Sie die Abfrage nur mit Spalten, die alle Werte in der Klausel "in" enthalten

Sie können dies tun, indem Sie die IDs in einem Array aggregieren und dieses dann mit der Liste der beabsichtigten IDs vergleichen:

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'];

Das Obige setzt voraus, dass venue.id als Primärschlüssel deklariert (wegen der group by ).

Sie müssen die IDs in der Abfrage nicht wirklich fest codieren, wenn Sie nur die Namen der Einrichtungen übergeben möchten:

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'));

Online-Beispiel:https://rextester.com/FNNVXO34389