MS Access Left Join无法正常工作

时间:2017-09-12 21:06:47

标签: sql ms-access ms-access-2013

我正在尝试在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"));

谢谢。

2 个答案:

答案 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];