当join子句包含条件时,外部联接的行为异常

时间:2019-03-13 14:09:03

标签: mysql left-join aggregate-functions

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

预期结果:一个三行的结果集,每个客户一个。

0 个答案:

没有答案