Чтобы оставить это в LEFT JOIN, добавьте значение null (или поместите предложение where в JOIN, как это сделал Стив Мейн).

этого вопроса, давайте предположим эту структуру таблицы:

People:
PersonID int PK
Name varchar(50)
Place int NULL FK -> Places.PlaceID
MovedIn datetime

Places:
PlaceID int PK
Name varchar(50)

Я хочу определить, сколько людей живет в каждом месте:

SELECT pla.PlaceID, COUNT(*)
FROM Places AS pla
LEFT JOIN People as peo ON peo.PlaceID = pla.PlaceID
GROUP BY pla.PlaceID

В этом запросе будут пропущены места, где нет людей, живущих там. Есть ли способ заставить его считать 0 вместо этого?

(Я нацеливаюсь на SQL Server 2005, если неважно, что это важно)

РЕДАКТИРОВАТЬ: Вот мой реальный (анонимный) запрос, после попытки адаптировать решение Стива:

SELECT
    ft.FooTypeID, COUNT(f.FooID)
FROM FooType as ft
LEFT OUTER JOIN Foo f ON ft.FooTypeID = f.FooTypeID
LEFT JOIN FooConfig fc ON ft.NotificationConfigID = fc.FooConfigID
WHERE
    DateDiff(day, GetDate(), f.Date) > 0 AND
    DateDiff(day, GetDate(), f.Date) < fc.Days
GROUP BY ft.FooTypeID

(Перевод между моим первоначальным примером и этим: Foo -> People, FooType -> Places, FooConfig -> Третья таблица, для дополнительного удовольствия) Я могу сделать это с помощью решения Fosco, но я бы предпочел решение Стива.

Ответы на вопрос(4)

Ваш ответ на вопрос