我正在尝试在MS Access 2013中编写查询,并且左连接无法正常工作。它就像一个普通的连接。
这是我正在尝试做的事情。
我的第一个表[All Category Types]
有一列[Category Types]
。然后我试图将其连接到一个包含两个聚合字段的查询。虚拟表[Average by Category Type]
首先按所有者分组,然后按[Category Type]
分组。接下来是求和字段[CountOfIncident: Number]
。
我想要的结果是表[All Category Types]
中的每个项目,然后是正确的[CountOfIncident: Number] where Owner == "France"
。这不是左连接。它只显示[All Category Types]
中[Average by Category Type]
中具有匹配记录的值。
如果我从此表中删除所有者,并且只按[Category Type]
分组,则它可以正常工作。是否有一些关于在group by子句中有多个字段的内容,它不允许查询中的左连接正常工作?
SELECT [All Category Types].[Category Type],
[Average by Category Type].[CountOfIncident: Number]
FROM [All Category Types]
LEFT JOIN [Average by Category Type]
ON [All Category Types].[Category Type] = [Average by Category Type].[Category Type]
WHERE ((([Average by Category Type].Owner)="France"));
谢谢。
答案 0 :(得分:2)
[Average by Category Type].Owner = "France"
只能对内连接记录为true。对于外部联接记录,[Average by Category Type].Owner
为空。
因此,您的WHERE
子句将您的外连接转换为内连接。将条件移动到ON
子句:
SELECT
[All Category Types].[Category Type],
[Average by Category Type].[CountOfIncident: Number]
FROM [All Category Types]
LEFT JOIN [Average by Category Type]
ON ([Average by Category Type].[Category Type] = [All Category Types].[Category Type]
AND [Average by Category Type].Owner = "France");
更新:与其他DBMS MS Access不同,ON
子句需要使用括号:JOIN tablename ON (...)
而不是JOIN tablename ON ...
。
答案 1 :(得分:1)
Thorsten Kettner的陈述是正确的,WHERE子句基本上将语句变成了INNER JOIN的等价物。
使LEFT JOIN工作的关键是理解应用标准的顺序。始终首先应用JOIN条件,然后在连接所有记录后应用WHERE子句。由于在LEFT JOIN中您需要左表中的所有记录,无论是否满足连接条件,您必须确保所有条件都应用于BEFORE或作为连接条件的一部分。
如果你能得到Thorsten的回答来处理联接中的所有条件,我建议采用这种方法。但是如果您遇到问题(极有可能使用Access),那么您还可以在子查询中应用某些条件,或者在保存的查询中添加WHERE条件[按类别列出的平均值]。也许这是显而易见的,但在上述关于执行顺序的解释的上下文中,子查询 - 包括WHERE子句中的任何过滤 - 在应用LEFT JOIN之前完成。
SELECT
[All Category Types].[Category Type],
AverageFiltered.[CountOfIncident: Number]
FROM [All Category Types]
LEFT JOIN
(SELECT * FROM [Average by Category Type]
WHERE [Average by Category Type].Owner = 'France')
As AverageFiltered
ON [All Category Types].[Category Type] = AverageFiltered.[Category Type];