sql >> Databáze >  >> RDS >> PostgreSQL

Komplexní SQL dotaz s více tabulkami a vztahy

Věřím, že tento dotaz udělá to, co chcete:

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

Používá array_agg přes teamid pro každého hráče v plays přiřadit hráče s přesně stejnou konfigurací týmu. Zahrnul jsem například sloupec s týmy, ale ten lze odstranit, aniž by to ovlivnilo výsledky, pokud nebude ze skupiny odstraněn klauzulí.

Příklad SQL Fiddle. Testováno pomocí Postgesql 9.2.4

EDIT:Opravena chyba, která duplikovala řádky.



  1. Jsou možné vlastní typy JPA (EclipseLink)?

  2. Počet záznamů vrácených skupinou

  3. Syntaxe MySQL Chyba správné syntaxe pro použití blízko 'desc

  4. MYSQL PHP aktualizuje data každého řádku