PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Requête SQL complexe avec plusieurs tables et relations

Je pense que cette requête fera ce que vous voulez :

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

Il utilise array_agg sur l'ID d'équipe pour chaque joueur dans les plays pour faire correspondre des joueurs avec exactement la même configuration d'équipe. J'ai inclus une colonne avec les équipes par exemple, mais qui peut être supprimée sans affecter les résultats tant qu'elle n'est pas supprimée de la clause group by.

Exemple SQL Fiddle. Testé avec Postgesql 9.2.4

EDIT :Correction d'une erreur qui doublait les lignes.