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
    

    playsの各プレーヤーのチームIDに対してarray_aggを使用します まったく同じチーム構成のプレーヤーと一致させるため。たとえば、チームの列を含めましたが、group by句から削除されない限り、結果に影響を与えることなく削除できます。

    SQLFiddleの例。 Postgesql9.2.4でテスト済み

    編集:行を複製するエラーを修正しました。



    1. SQL 2000/2005でOracleデータベースにリンクされたサーバーをどのようにセットアップしますか?

    2. mysqlの債務とクレジットテーブルから簡単な元帳を作成するのに助けが必要ですか?

    3. mysqlデータベースにスーパー特権を追加する方法は?

    4. OracleのLobセグメント(SYS_LOB)を理解していますか?