PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy vấn SQL phức tạp với nhiều bảng và quan hệ

Tôi tin rằng truy vấn này sẽ làm được những gì bạn muốn:

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

Nó sử dụng array_agg trên teamid cho mỗi người chơi trong plays để so khớp những người chơi có cùng cấu hình đội. Ví dụ, tôi đã bao gồm một cột với các nhóm, nhưng cột đó có thể bị xóa mà không ảnh hưởng đến kết quả miễn là nó không bị xóa khỏi nhóm theo mệnh đề.

Ví dụ về SQL Fiddle. Đã kiểm tra với Postgesql 9.2.4

CHỈNH SỬA:Đã sửa lỗi làm trùng lặp các hàng.



  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 sẽ không chấp nhận bí danh bảng trước tên cột

  2. SQLAlchemy Core - tạo biểu thức PostgreSQL SUBSTRING?

  3. Cách sử dụng trình kích hoạt PostgreSQL?

  4. Bây giờ () không có múi giờ

  5. Hệ số lấp đầy cho một chỉ số tuần tự là PK