我试图为我的问题找到解决方案但是数小时的思考和搜索并没有帮助。所以我想也许我可以在这里问一下。
我有两张桌子:
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;
我想我需要使用左外连接,但不知怎的,我无法弄清楚如何正确编写它。
答案 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
子句可能非常有用。