我试图在MS Access中的查询中检索两个开放类型,如下图所示。
当我的结果中同时出现这两个值时,它们将产生每个位置中有多少个职位的数量。
在相关表格上根本没有选择任何一种开门类型时,它不会显示在查询计数上,如下所示。
这是我的SQL的副本
SELECT
tblOpening.fk_OpeningTypeId,
Count(tblOpening.Position) AS CountOfPosition
FROM
tblOpeningCity INNER JOIN tblOpening ON
tblOpeningCity.OpeningCityID = tblOpening.City
WHERE
tblOpening.Position = "Flex Officer" AND
tblOpening.Closed = No AND
(
tblOpeningCity.OpeningCity = "Livermore" OR
tblOpeningCity.OpeningCity = "Pleasanton"
)
GROUP BY
tblOpening.fk_OpeningTypeId;
我尝试过使用各种类型的外部联接,但是没有运气。
这是一个示例数据,与我的数据库使用的数据相似。
我是SQL的新手,请不要使用空手。
答案 0 :(得分:1)
假设您有一个表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
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(即使该列不在选择列表中),这与tblOpeningType
的LEFT JOIN要求相同。因此,我将带有此WHERE子句的SELECT用作子选择。子选择只是一个带有给定别名((SELECT ...) X
)的括在方括号X
中的SELECT命令,其用法类似于周围查询中的表。
答案 1 :(得分:0)
在我的评论之后,假设您有一个所有可能的开门类型的单独表(例如,主键为tblOpeningTypes
的{{1}}),那么我建议如下:
id