Postgres 问题:a和b都不对吗?



对于以下问题,请使用以下模式定义。

餐厅(地址、名称、电话、街道、城市、州、邮编(客户(cid、fname、lname、电话、街道、城市、州、邮政编码(载波(crid、fname、lname、lp(交付(did、rid、cid、tim、大小、重量(拾音器(did,tim,crid(下降

这是一个使用食品搬运器(搬运台(的食品配送企业的模式。顾客(餐桌(从餐馆(餐桌(点餐。餐馆点外卖(外卖桌(;把食物从餐馆送到顾客手中。取餐台记录承运人在餐厅取餐的时间。送餐台记录了送餐员何时向顾客送餐。

1.找到交货少于5次的客户。

a。选择cid,count((从交货按cid分组具有count((<5.

b。选择a.cid,count((来自客户a内部联接传递b使用(cid(按.id分组具有count((<5.

c。选择a.cid,count((来自客户a左侧外部联接传递b关于a.cid=b.cid按.id分组具有count((<5.

d。选择cid,sum(如果b.cid不为null,则1 else 0结束(来自客户a左侧外部联接传递b使用(cid(按cid分组具有sum(b.cid不为空时的情况,然后1 else 0结束(<5.

e。(自己写答案(

不,它们不正确。他们想念那些没有送货的顾客。

最后一个是一堆不太好的查询中最好的一个。更好的版本是:

select c.cid, count(d.cid)
from customer c left outer join
delivery d
on c.cid = d.cid
group by c.cid
having count(d.cid) < 5;

sum(case)过杀。Postgres甚至提供了比这更好的解决方案!

count(*) filter (where d.cid is not null)

但是count(d.cid)仍然更简洁。

还要注意使用有意义的表别名。不要养成在表格中使用任意字母的习惯。这只会让查询变得难以理解。

最新更新