Основная особенность запроса left outer join
заключается в том, что он сохраняет все строки левой таблицы.Но у меня есть ситуация, когда (в MySQL) это не работает;а именно, при использовании предложения group by
в правой таблице и добавлении условия к части 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;
Iполучить строку для каждой строки в таблице CUSTOMERS (если TURNOVER
равно NULL, если нет строк ORDERS.)
Однако, с помощью этого слегка измененного запроса ...
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 не имеют соответствующей строки результатов.Интересно, что это, по-видимому, не напрямую связано с тем, существуют ли строки ORDERS, которые удовлетворяют условию ORDERDATE > ...
.Даже если в ORDERS нет строк, которые бы удовлетворяли этому вообще, я получаю хотя бы одну (в моей небольшой тестовой базе данных) строку результатов.Но похоже, что если у клиента есть хотя бы одна совпадающая строка ORDERS, которая удовлетворяет условию, то этот клиент присутствует в наборе результатов.
Итак, что я могу сделать, чтобы получить желаемый результат - сохранение строки CUSTOMERS, получая по одной строке для каждого клиента, независимо от того, есть ли у него строки ORDERS, которые удовлетворяют условию, или нет?
Бонусные баллы для тех, кто может указать, где лежит мое неправильное понимание запросов внешнего соединения.:)
Обновлено для добавления (2019-03-18):
Чтобы уточнить ... Таблица ЗАКАЗЧИКИ:
CUSTID : NAME
-----------------------
1 : John Doe
2 : Frank Duffmann
3 : Maggie Mae
Таблица ORDERS:
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
Ожидаемый результат: Набор результатов с тремя строками, по одной для каждого CUSTOMER.