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

Złożone zapytanie SQL z wieloma tabelami i relacjami

Wierzę, że to zapytanie zrobi to, czego chcesz:

SELECT array_agg(players), player_teams
FROM (
  SELECT DISTINCT t1.t1player AS players, t1.player_teams
  FROM (
    SELECT
      p.playerid AS t1id,
      concat(p.playerid,':', p.playername, ' ') AS t1player,
      array_agg(pl.teamid ORDER BY pl.teamid) AS player_teams
    FROM player p
    LEFT JOIN plays pl ON p.playerid = pl.playerid
    GROUP BY p.playerid, p.playername
  ) t1
INNER JOIN (
  SELECT
    p.playerid AS t2id,
    array_agg(pl.teamid ORDER BY pl.teamid) AS player_teams
  FROM player p
  LEFT JOIN plays pl ON p.playerid = pl.playerid
  GROUP BY p.playerid, p.playername
) t2 ON t1.player_teams=t2.player_teams AND t1.t1id <> t2.t2id
) innerQuery
GROUP BY player_teams


Result:
PLAYERS               PLAYER_TEAMS
2:Allen,3:Pierce      1,3
4:Garnett,5:Perkins

Używa array_agg nad teamid dla każdego gracza w plays aby dopasować graczy z dokładnie taką samą konfiguracją drużyny. Na przykład dołączyłem kolumnę z zespołami, ale można ją usunąć bez wpływu na wyniki, o ile nie zostanie ona usunięta z klauzuli group by.

Przykład SQL Fiddle. Testowane z Postgesql 9.2.4

EDYCJA:Naprawiono błąd, który powodował powielanie wierszy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Repozytorium - sortowanie według w natywnym zapytaniu nie działa

  2. Dzień programisty PostgreSQL w Pradze 2016

  3. Migracja z MySQL do PostgreSQL

  4. Zamień reprezentację daty postgres w ciąg ISO 8601

  5. Jak przekonwertować znacznik czasu na liczbę całkowitą (epoka Uniksa) w Postgresie