2

对于下表(我用**表示主键的部分)

Team (*tid*, name)
Game (*gid*, tid, name, year)
Member (*mid*, name)
MemberOf (*mid*, *tid*, startyear, endyear, position)

我需要显示每个前锋的历史(位置) 如果 startyear 为 NULL,则使用该球队该球员最早比赛的年份 结果:前锋姓名、球队名称、开始年份、结束年份 按前锋姓名排序,然后开始年份

虽然我有一个解决方案,但我认为它不是很有效执行计划推断节点成本为 28。是否希望改进建议和解释?

4

1 回答 1

2

您可以通过一个查询来执行此操作,使用left outer joinand coalesce(如果我的逻辑正确):

SELECT Striker_Name, Team_Name, coalesce(MO.STARTYEAR, g.start_year), MO.ENDYEAR
FROM (SELECT NAME AS Striker_Name, MID
      FROM MEMBER
      ) ME JOIN
      (SELECT MID, TID, STARTYEAR AS Start_Year, ENDYEAR AS End_Year
       FROM MEMBEROF
       WHERE POSITION = 'striker'
      ) MO ON ME.MID = MO.MID left outer JOIN
      (SELECT NAME AS Team_Name, TID
       FROM TEAM
      ) T
      ON MO.TID = T.TID left outer JOIN
      (SELECT GID, MIN(GAME.YEAR) AS Start_Year FROM GAME GROUP BY TID
      ) G
      ON G.TID = MO.TID
ORDER BY Striker_Name, Start_Year

您似乎从最早的游戏开始填写开始年份。只需进行连接并决定使用select哪一个。

于 2013-02-04T19:16:10.343 回答