sql >> Databasteknik >  >> RDS >> PostgreSQL

Komplex SQL-fråga med flera tabeller och relationer

Jag tror att den här frågan kommer att göra vad du vill:

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

Den använder array_agg över teamet för varje spelare i plays att matcha spelare med exakt samma lagkonfiguration. Jag inkluderade till exempel en kolumn med lagen, men den kan tas bort utan att det påverkar resultaten så länge den inte tas bort från gruppen genom klausul.

SQL Fiddle-exempel. Testad med Postgesql 9.2.4

EDIT:Fixade ett fel som duplicerade rader.



  1. NodeJS – Lägg till Array of String i PostgreSQL Query

  2. Sökvärde i alla tabeller i databasen

  3. Hur hittar man gränserna för grupper av sammanhängande sekventiella tal?

  4. Arkivera en Jframe från MySQL