PostgreSQL加入两个表格语法

时间:2018-06-09 22:55:34

标签: sql postgresql join left-join

我试图为我的问题找到解决方案但是数小时的思考和搜索并没有帮助。所以我想也许我可以在这里问一下。

我有两张桌子:

Table: Project

projectid  | projectName | projectInformation | totalPrice |  projectStatus  
-------------- ------------  -------------------  ----------    -------------
  1          "Education"     "Information..."      2000          FALSE    
  2          "Hospital"      "Information..."      3000          TRUE
  3          "Water"         "Information..."      1000          TRUE


  Table: Donations
  donationid | donationamount | date | costumerid | projectid
  ----------   --------------   ----   ----------   ---------
  1               10            now()   3            1
  2               20            now()   1            2
  3               50            now()   2            2
  4               15            now()   4            3

我想归档以下结果:

projectid | projectname | projectinformation | totalprice | projectstatus | sum(amount)
1            "Education"     "information..."    2000          FALSE          325
2            "Hospital"      "information..."    3000          TRUE           
3            "Water"         "information..."    1000          TRUE           120

因此,客户可以为项目捐赠x金额。

我想显示每个项目收集的金额。当我执行以下查询时,它仅向我提供仅有捐赠的项目。如果还没有捐款,我想展示所有项目,例如默认金额为0美元。

这是我的查询,只给项目捐款:

select projectid, projectname, projectinformation, totalprice, projectstatus, sum(amount) 
from project 
     natural join donation 
group by projectid, projectname, projectinformation, totalprice, projectstatus;

我想我需要使用左外连接,但不知怎的,我无法弄清楚如何正确编写它。

1 个答案:

答案 0 :(得分:1)

您可以使用left join

select p.projectid, p.projectname, p.projectinformation, p.totalprice, 
       p.projectstatus, coalesce(sum(d.amount), 0)
from project p left join
     donation d
     on p.project_id = d.project_id
group by p.projectid, p.projectname, p.projectinformation, p.totalprice, p.projectstatus;

我强烈反对您不使用natural join。省略join键会使查询难以遵循并且很难调试。您可以使用join使用的错误密钥轻松犯错。

我实际上认为natural join是一种憎恶,因为它取决于列的名称而不是正式声明的外键关系 - " abomination"是我对忽略这种故意声明的关系的描述。如果你想要一个简写,using子句可能非常有用。