PostgreSQL:具有多个条件的多个LEFT JOIN

时间:2016-05-18 09:07:20

标签: postgresql database-design left-join conditional-statements postgresql-9.2

以下是我的数据模型的摘录(包括表格内容的摘录)。

enter image description here

我需要在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

1 个答案:

答案 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;