Внешнее соединение ведет себя неожиданно, когда в предложении объединения содержится условие - PullRequest
0 голосов
/ 13 марта 2019

Основная особенность запроса 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.

...