left outer join
查询的核心功能是保留左表的所有行。但是我有一种情况(在MySQL中)似乎不起作用。即,在右侧表上使用group by
子句并向join子句的on
部分添加条件时。
此查询按预期工作:
select CUSTOMERS.*, sum(ORDERS.ORDERTOTAL) as TURNOVER from CUSTOMERS
left outer join ORDERS on (ORDERS.CUSTID=CUSTOMERS.CUSTID)
group by ORDERS.CUSTID
order by CUSTOMERS.CUSTID;
我在CUSTOMERS表中的每一行都有一行(如果没有ORDERS行,则TURNOVER
为NULL。)
但是,通过稍微修改的查询...
select CUSTOMERS.*, sum(ORDERS.ORDERTOTAL) as TURNOVER from CUSTOMERS
left outer join ORDERS on (ORDERS.CUSTID=CUSTOMERS.CUSTID) and (ORDERS.ORDERDATE > '2018-01-01')
group by ORDERS.CUSTID
order by CUSTOMERS.CUSTID;
...结果有很大不同:CUSTOMERS表中的某些行没有相应的结果行。有趣的是,这似乎与是否存在满足ORDERDATE > ...
条件的ORDERS行没有直接关系。即使在ORDERS中根本没有行可以满足此要求,我还是得到了至少一个(在我的小型测试数据库中)结果行。但是看起来,如果一个主持人至少有一个匹配的ORDERS行满足条件,那么该客户就出现在结果集中。
那我该怎么做才能获得理想的结果-保留客户行,为每位客户获得一行,无论其是否有满足条件的ORDERS行?
任何可以指出我对外部联接查询的误解所在的人都可以得到奖励。 :)
已更新为添加(2019-03-18):
为了澄清...表客户:
CUSTID : NAME
-----------------------
1 : John Doe
2 : Frank Duffmann
3 : Maggie Mae
表顺序:
ORDERID : CUSTID : ORDERDATE : ORDERTOTAL
-------------------------------------------
1 : 1 : 2018-01-01 : 150.00
2 : 3 : 2019-01-01 : 77.77
3 : 3 : 2019-01-01 : 88.88
4 : 1 : 2017-01-01 : 100.00
预期结果:一个三行的结果集,每个客户一个。