PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wybieranie pasującego podzbioru w relacji wiele do wielu

Select project_ID 
from user_projects
where user_ID in (1,2)
group by project_ID
Having count(*) = 2

Wiesz, że masz 2 użytkowników, wiesz, że będą oni unikalni (klucz podstawowy), więc wiesz, że jeśli są 2 rekordy dla tego samego projektu, to właśnie tego chcesz.

Twoje pytanie wskazało, że masz GIVEN wysłanych użytkowników, dlatego wiesz, jacy użytkownicy i ilu ich jest. powyższy kod SQL może zostać zaktualizowany, aby zaakceptować parametry dla tych znanych, a zatem pozostaje dynamiczny, nie ograniczając się tylko do 2 użytkowników.

where user_ID in (userlist)
having count(*) = (cntuserList)

-----------Do obsługi sytuacji, gdy zbiór użytkowników jest pusty-----

Select P.project_ID 
from Projects P
LEFT JOIN user_projects UP
where (UP.user_ID in (1,2) OR UP.USER_ID is null)
group by project_ID
Having count(*) = 2

Oto, co to robi. Zwraca wszystkie projekty, a jeśli istnieje użytkownik powiązany z tym projektem, identyfikuje go. Jeśli zestaw zawiera użytkowników, lista zwróconych projektów jest filtrowana według tego zestawu, zapewniając, że cały zestaw znajduje się w projekcie za pomocą klauzuli have.

Jeśli zestaw jest pusty, lewe sprzężenie wraz z instrukcją userID is null zachowa projekty bez użytkowników na liście, niezależnie od tego, czy zestaw jest pusty, czy nie. Klauzula having dalej zmniejszy zbiór do liczby użytkowników zdefiniowanych w zbiorze LUB 0 wskazujące zwrócenie wszystkich projektów bez przypisanych użytkowników.

Dodatkowym przypadkiem brzegowym, którego jeszcze nie omawialiśmy, jest to, co powinno się stać, jeśli projekt zawiera więcej użytkowników niż zdefiniowano w zestawie. Niebawem ten projekt zostanie zwrócony; ale nie jestem przekonany, że tego chciałeś.

na marginesie dzięki za skłonienie mnie do myślenia. Nie zagłębiam się już w kod; dlatego od czasu do czasu tu troluję, żeby sprawdzić, czy mogę pomóc!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL/JDBC i TIMESTAMP vs. TIMESTAMPTZ

  2. Wstawianie NEW.* z ogólnego wyzwalacza za pomocą EXECUTE w PL/pgsql

  3. LISTEN limit czasu zapytania z node-postgres?

  4. Postgres zwraca [null] zamiast [] dla array_agg tabeli łączenia

  5. Czy wersja sterownika JDBC i wersja bazy danych muszą być dokładnie takie same?