Miltäs tämä näyttää:
SQL:SELECT "Player"."id", "Player"."lastName", "Team"."name", "PlayerStats"."goals", "PlayerStats"."assists" FROM ( SELECT "Player"."id", SUM("Stats"."goals") AS "goals", SUM("Stats"."assists") AS "assists" FROM "Player" INNER JOIN ( SELECT "GameStats"."playerId" AS "playerId", "GameStats"."goals" AS "goals", "GameStats"."assists" AS "assists", ROW_NUMBER() OVER ( PARTITION BY "GameStats"."playerId" ORDER BY "Game"."gameDate" DESC ) AS "seqnum" FROM "Game" JOIN "GameStats" ON ( "Game"."id" = "GameStats"."gameId" ) ) "Stats" ON ( "Player"."id" = "Stats"."playerId" ) WHERE "Stats"."seqnum" < 6 GROUP BY "Player"."id" ) AS "PlayerStats" JOIN "Player" ON "PlayerStats"."id" = "Player"."id" JOIN "PlayerTeam" ON "Player"."id" = "PlayerTeam"."playerId" JOIN "Team" ON "PlayerTeam"."teamId" = "Team"."id" WHERE "PlayerTeam"."endDate" IS NULL
Nyt tämä toimii hyvin pitkälti niin kuin haluankin. Pystyn Player-taulukon relaatioita joinailemaan tilastojen laskennan jälkeen miten haluan.
Mietityttää tuo WHERE ehto. Joinaan PlayerTeam taulukkoon kaikki joukkueet. Tapahtuuko tuossa nyt niin, että joinaan myös se joukkueet, joissa endDate ei ole null ja filtteröinti tapahtuu vasta lopputuloksesta, vai tajuaako tietokanta automaattisesti olla joinaamatta ne rivit, jotka WHERE-lauseke lukee pois?
Riippuu siitä minkälaisen suoritussuunnitelman kanta tekee tuosta kyselystä.
Jos tekee "oikein" niin enddate rajaus tehdää ensin ja sitten join. Saattaa vaatia indeksin enddate kentälle.
Katso kyselyn plan kannasta niin näet miten se oikeasti suoritetaan.