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如果totallaptime他们在数据库中没有任何条目,则列出一个races

(抱歉问题标题含糊不清,我想不出任何方法来总结这个问题)

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

ALEFT JOIN选择左表的所有行,如果存在则从右表返回结果,如果不存在则返回值为 NULL 的单行。

注意:我COALESCE在语句中添加了 a 因为求和 aNULL将导致NULL; 这会将这些值更改为 0。

于 2013-02-25T09:48:28.500 回答
3

您将不得不使用 a 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

编辑必须使用 LEFT JOIN 甚至包括左表中的不匹配记录

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 回答