第一遍(使用表别名,使其更清晰):
SELECT
t1.cod
,coalesce(sum(t2.valor), 0) FirstSum
,coalesce(sum(t3.valor_justificativa), 0) SecondSum
from tab_ug t1
inner join contas t2
on co.ug = t1.cod
inner join justificativas t3
on t3.cod_contas = t2.cod
where t2.conta_monitorada = 'Sim'
group by t1.cod
(连接表时始终使用该ON
子句)
此查询假定您只想检索所有表中存在的项目。如果在tab_ug
中找不到给定的项目,则不contas
会将其包含在结果集中。同样,如果在contas
中未找到“找到”的给定项目justificativas
,则它不会被考虑到结果集中。要解决此问题,您需要使用外部连接,如下所示:
SELECT
t1.cod
,coalesce(sum(t2.valor), 0) FirstSum
,coalesce(sum(t3.valor_justificativa), 0) SecondSum
from tab_ug t1
left outer join contas t2
on co.ug = t1.cod
and t2.conta_monitorada = 'Sim'
left outer join justificativas t3
on t3.cod_contas = t2.cod
group by t1.cod
ON
(如果没有该子句,外连接很难正常工作......)
这将包括所有项目,tab_ug
即使它们在contas
;中没有匹配项。同样,所有项目 incontas
都将被考虑在内,即使它们在 中没有项目justificativas
。
这里有一个更微妙的问题:如果给定的contas
项目在 中有两个或更多相关行justificativas
,则该contas
项目将多次计入总和,例如
ug contas justificativas
1 A, 1 j7, 102
1 A, 1 j8, 103
2 <null> <null>
group by 将拿下这个并制作
cod FirstSum SecondSum
1 2 205
2 0 0
在这一点上我不得不放弃,因为我不知道查询要求的全部范围。