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を使用して、1つのクエリでこれを行うことができます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 に答える