Необходимое объяснение для отсутствующих строк с левым соединением и count ()

Может ли кто-нибудь помочь мне понять следующее поведение, которое происходит, когда я добавляю предложение 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, запрос больше не будет выводить количество нулей для клиентов, которые не размещали никаких заказов, даже если я выполняю LEFT JOIN:

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

Теперь, если я перейду условие WHERE как часть LEFT JOIN, как показано ниже, я возвращаю свои нулевые значения для клиентов, которые не разместили заказы:

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. Спасибо!

12
задан OMG Ponies 4 June 2011 в 05:05
поделиться