sql >> Database >  >> RDS >> PostgreSQL

Complexe SQL-query met meerdere tabellen en relaties

Ik denk dat deze zoekopdracht zal doen wat je wilt:

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

Het gebruikt array_agg over de teamid voor elke speler in plays om spelers met exact dezelfde teamconfiguratie te matchen. Ik heb bijvoorbeeld een kolom met de teams opgenomen, maar die kan worden verwijderd zonder de resultaten te beïnvloeden, zolang deze niet per clausule uit de groep wordt verwijderd.

SQL Fiddle-voorbeeld. Getest met Postgesql 9.2.4

EDIT:Een fout verholpen die rijen dupliceerde.



  1. MySQL-installatieprogramma loopt vast bij het starten van de service

  2. NULL-waarden opnemen in een query met Outer Join en Group By

  3. SQL Server - Rijen omzetten in kolommen

  4. TSQL - Kolom toevoegen aan alle tabellen in een database [ Cursorvoorbeeld]