PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Сложна SQL заявка с множество таблици и релации

Вярвам, че тази заявка ще направи това, което искате:

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

Той използва array_agg над teamid за всеки играч в plays за да съчетаете играчи с точно същата конфигурация на отбора. Включих например колона с отборите, но тя може да бъде премахната, без това да повлияе на резултатите, стига да не бъде премахната от клаузата за групата.

Пример за SQL Fiddle. Тествано с Postgesql 9.2.4

РЕДАКТИРАНЕ:Поправена е грешка, която дублира редове.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:изберете сумата от стойности и след това сумирайте това отново

  2. Актуализирайте част (номер на поръчка), която е първичен ключ в Postgre

  3. Как да избегнете долни черти в Postgresql

  4. Най-бърза проверка дали ред съществува в PostgreSQL

  5. Как да конвертирате postgres двойна точност в числова без загуба/отрязване на данни