2

だから私はこのselectステートメントを使用しています:

select runners.name, runners.age, sum(races.laptime) as totallaptime
from runners join races on runners.runnerid = races.runnerid
where runners.region = "region001"
group by runners.runnerid

これにより、特定の地域のすべてのランナーが一覧表示され、すべてのラップタイムの合計が表示されます。

残念ながら、これはまだラップタイムがないその地域のすべてのランナーを見逃します(おそらくracesデータベースにエントリがないためです)。

このステートメントを調整selectして、特定の地域のすべてのランナーが含まれるようにし、データベースにエントリがない場合のをリストする0にはどうすればよいですか?totallaptimeraces

(あいまいな質問のタイトルで申し訳ありませんが、この質問を要約する方法は考えられませんでした)

TIA

4

3 に答える 3

5

を使用しLEFT JOINます:

select runners.name, runners.age, coalesce(sum(races.laptime),0) as totallaptime
from runners 
left join races on runners.runnerid = races.runnerid
where runners.region = "region001"
group by runners.runnerid

Aは、左側のテーブルのすべての行LEFT JOINを選択し、右側のテーブルが存在する場合は結果を返し、存在しない場合は値がNULLの単一の行を返します。

注:aを合計すると;になるCOALESCEため、ステートメントにaを追加しました。これにより、これらの値が0に変更されます。NULLNULL

于 2013-02-25T09:48:28.500 に答える
3

を使用する必要があります。これにより、一致する「右」テーブルがないLEFT OUTER JOIN「左」テーブル(この場合は)からの結果も得られます。runners

select runners.name, runners.age, sum(races.laptime) as totallaptime
from runners LEFT OUTER JOIN races on runners.runnerid = races.runnerid
where runners.region = "region001"
group by runners.runnerid
于 2013-02-25T09:49:31.557 に答える
1

編集左側のテーブルの一致しないレコードも含めるには、LEFTJOINを使用する必要があります

select runners.name, runners.age, sum(races.laptime) as totallaptime
from runners left join races on runners.runnerid = races.runnerid
where runners.region = "region001"
group by runners.runnerid
于 2013-02-25T09:48:54.143 に答える