所以我一直在使用这个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
{1}}数据库?
(对不起,对于模糊的问题标题,我无法想出总结这个问题的方法)
TIA
答案 0 :(得分: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
LEFT JOIN
选择左表的所有行,如果存在则返回右表的结果,如果不存在,则返回值为NULL的单行。
注意:我在语句中添加了COALESCE
,因为汇总NULL
会产生NULL
;这会将这些值更改为0。
答案 1 :(得分: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
答案 2 :(得分: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