sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL waar alles in array staat

Ervan uitgaande dat de join-tabel de goede gewoonte volgt en een unieke samengestelde sleutel heeft gedefinieerd, d.w.z. een beperking om dubbele rijen te voorkomen, dan zou zoiets als de volgende eenvoudige query moeten doen.

select conversation_id from conversations_users where user_id in (1, 2)
group by conversation_id having count(*) = 2

Het is belangrijk op te merken dat het cijfer 2 aan het einde de lengte is van de lijst met gebruikers-ID's. Dat moet natuurlijk veranderen als de user_id-lijst van lengte verandert. Als u niet kunt aannemen dat uw join-tabel geen duplicaten bevat, wijzigt u "count(*)" in "count(distinct user_id)" tegen mogelijke prestatiekosten.

Deze zoekopdracht vindt alle gesprekken die alle opgegeven gebruikers bevatten zelfs als het gesprek bevat ook extra gebruikers.

Als je alleen gesprekken wilt met precies de gespecificeerde set gebruikers, is een benadering om een ​​geneste subquery te gebruiken in de waar-clausule, zoals hieronder. Let op, de eerste en laatste regel zijn hetzelfde als de originele zoekopdracht, alleen de middelste twee regels zijn nieuw.

select conversation_id from conversations_users where user_id in (1, 2)
   and conversation_id not in
   (select conversation_id from conversations_users where user_id not in (1,2))
group by conversation_id having count(*) = 2

Op dezelfde manier kunt u een set-verschil-operator gebruiken als uw database dit ondersteunt. Hier is een voorbeeld in de Oracle-syntaxis. (Voor Postgres of DB2, verander het sleutelwoord "min" in "behalve.)

select conversation_id from conversations_users where user_id in (1, 2)
  group by conversation_id having count(*) = 2
minus
  select conversation_id from conversations_users where user_id not in (1,2)

Een goede query-optimizer zou behandel de laatste twee varianten identiek, maar controleer voor de zekerheid uw specifieke database. Het Oracle 11GR2-queryplan sorteert bijvoorbeeld de twee sets conversatie-ID's voordat de min-operator wordt toegepast, maar slaat de sorteerstap voor de laatste query over. Dus beide queryplannen kunnen sneller zijn, afhankelijk van meerdere factoren, zoals het aantal rijen, kernen, cache, indices, enz.



  1. verbinding maken met de postgres-server op google compute engine

  2. Gegevens opmaken in Power BI Desktop-visualisaties

  3. Is er een ernstige prestatiehit voor het gebruik van buitenlandse sleutels in SQL Server?

  4. Joomla SQL-injectie-kwetsbaarheid