以下是我的数据模型的摘录(包括表格内容的摘录)。
我需要在2015年推算出类型1的操作次数。我还想在结果中找到完整的城镇列表,而不仅仅是operation
表中引用的城镇(数字等于零)没有注册业务的城镇)。然后,我需要指定几个条件,但WHERE
子句会将LEFT JOIN
变为INNER JOIN
(请参阅this post),因此我必须指定{{1}内的条件条款。
ON
我得到以下结果:
SELECT
town.town_code,
count(operation.*) AS nb
FROM town
LEFT JOIN operation ON town.town_code = operation.ope_town AND operation.ope_year = 2015
LEFT JOIN intervention ON operation.ope_id = intervention.int_ope_id
LEFT JOIN nature ON intervention.int_id = nature.int_id AND nature.type_id = 1
GROUP BY town.town_code ORDER BY town.town_code ;
城镇代码86003存在问题,该代码应该为0.此城镇代码指的是一个操作(town_code | nb
------------+-----
86000 | 1
86001 | 0
86002 | 1
86003 | 1
86004 | 0
86005 | 0
),它引用一个干预#5
来引用#16
}。所以其中一个条件没有填补......
我如何处理nature type = 3
条款中的几个条件?
编辑:以下是创建表格和测试的脚本。
ON
答案 0 :(得分:1)
这是因为你选择了第一个左连接。例如,您可以使用:
SELECT t.town_code, count(j.*) AS nb FROM town t
LEFT JOIN (SELECT o.ope_town cd, o.ope_year yr FROM operation o, intervention i, nature n
WHERE o.ope_year = 2015
AND o.ope_id = i.int_ope_id AND n.type_id = 1
AND i.int_id = n.int_id) j
ON j.cd = t.town_code
GROUP BY t.town_code ORDER BY t.town_code;