Предполагая, что у вас есть таблица tblOpeningType
, включите ее в запрос и используйте левое соединение, которое показывает все записи из левой таблицы.Кроме того, поскольку вы применяете предложение where к правой таблице, это разрушит эффект LEFT JOIN.Поэтому я использую суб-выбор.
SELECT
T.OpeningTypeId,
Count(X.Position) AS CountOfPosition
FROM
tblOpeningType T
LEFT JOIN (
SELECT
O.fk_OpeningTypeId AS OpeningTypeId,
O.Position
FROM
tblOpening O
INNER JOIN tblOpeningCity C
ON O.City = C.OpeningCityID
WHERE
O.Position = "Flex Officer" AND
O.Closed = No AND
(C.OpeningCity = "Livermore" OR C.OpeningCity = "Pleasanton")
) X
ON T.OpeningTypeId = X.OpeningTypeId
GROUP BY T.OpeningTypeId;
Когда две таблицы объединены, INNER JOIN дает результаты, когда в обеих таблицах есть соответствующая запись.LEFT JOIN дает результаты для всех записей левой таблицы, а когда записи отсутствуют в правой таблице, соответствующие столбцы результатов заполняются значением NULL.
Пример:
Person City
------ ----
Id Name CityId Id Name
-- ---- ------ -- -------
1 Joe 10 10 Atlanta
2 Sue 10 20 Boston
3 Tim 30 30 Chicago
A INNERЗапрос JOIN:
SELECT c.Id, c.Name AS City, p.Name AS Person
FROM City c INNER JOIN Person p ON c.Id = p.CityId
Результат:
Id City Person
-- ------- ------
10 Atlanta Joe
10 Atlanta Sue
30 Chicago Tim
С ЛЕВЫМ СОЕДИНЕНИЕМ (в этом запросе указана таблица слева):
SELECT c.Id, c.Name AS City, p.Name AS Person
FROM City c LEFT JOIN Person p ON c.Id = p.CityId
Результат:
Id City Person
-- ------- ------
10 Atlanta Joe
10 Atlanta Sue
20 Boston <NULL>
30 Chicago Tim
Теперь ваш запрос показывает дополнительную сложность.Это говорит WHERE tblOpening.Position = "Flex Officer" ...
.Это запрещает tblOpening.Position
быть NULL в наборе результатов (даже если столбец отсутствует в списке выбора), поскольку LEFT JOIN с tblOpeningType
потребует.Поэтому я использую SELECT с этим предложением WHERE в качестве дополнительного выбора.Подвыбор - это просто команда SELECT, заключенная в скобки (SELECT ...) X
с заданным псевдонимом (X
), которая используется как таблица в окружающем запросе.