Может ли кто-нибудь помочь мне разобраться в следующем поведении, которое происходит, когда я добавляю предложение WHERE в запрос, в котором есть LEFT JOIN с COUNT (*)?
У меня есть две таблицы:
TABLE 1: customers
customer_id | name
------------------
1 | Bob
2 | James
3 | Fred
TABLE 2: orders
order_id | customer_id | order_timestamp
----------------------------------------
1000 | 1 | 2011-01-01 00:00
1001 | 1 | 2011-01-05 00:00
1002 | 2 | 2011-01-10 00:00
Теперь следующий запрос сообщает мне, сколько заказов сделал каждый клиент:
select c.customer_id, count(o.order_id)
from customers c
left join orders o using (customer_id)
group by 1
customer_id | count
-------------------
1 | 2
2 | 1
3 | 0
Это прекрасно работает, НО, если я добавлю в запрос предложение WHERE, запрос больше не будетвыводит количество нулей для клиентов, которые не размещали никаких заказов, хотя я делаю ЛЕВНОЕ СОЕДИНЕНИЕ:
select c.customer_id, count(o.order_id)
from customers c
left join orders o using (customer_id)
where o.order_timestamp >= '2011-01-05'
group by 1
customer_id | count
-------------------
1 | 1
2 | 1
Теперь, если я переместлю условие ГДЕ как часть ЛЕВОГО СОЕДИНЕНИЯ, как показано ниже, я получуназад мои нулевые счета для клиентов, которые не размещали заказы:
select c.customer_id, count(o.order_id)
from customers c
left join orders o on (c.customer_id = o.customer_id) and (o.order_timestamp >= '2011-01-05')
group by 1
Я не понимаю, почему второй запрос не работает, а третий -?Может ли кто-нибудь дать мне объяснение?Также не уверен, что это имеет значение, но я использую postgres.Спасибо!