Access SQL 中的联接语句

Posted

技术标签:

【中文标题】Access SQL 中的联接语句【英文标题】:Join Statements in Access SQL 【发布时间】:2014-11-18 13:19:47 【问题描述】:

我不熟悉 SQL 以及它如何与 Access 一起工作,但我遇到了查询只返回特定集合中的项目的问题。

所以根据我阅读的定义,LEFT JOIN 语句应该返回左表中的所有记录,然后只返回右表中的特定记录。由于某种原因,它不会从我的左表返回所有记录。请看下面的代码。它仍然以某种方式只想返回具有某种关系的记录。有任何想法吗?我希望返回左表 (tbl_historicOrg) 中的所有记录,然后只返回右表中的特定记录。

SELECT tbl_historicOrg.NAME, tbl_historicOrg.Racf, tbl_historicOrg.STATUS, tbl_historicOrg.PCF, tbl_historicOrg.[Date Finalized], tbl_historicOrg.[Hist Month], import_data.SCHDLE_EXCPT_NM, import_data.HOURS
FROM tbl_historicOrg LEFT JOIN import_data ON tbl_historicOrg.Racf = import_data.RACF
WHERE (((import_data.SCHDLE_EXCPT_NM)="System Problems"));

任何建议或更正将不胜感激。

【问题讨论】:

所述查询将返回 tbl_historicOrg 中符合 WHERE 条件的所有记录。并将这些行与 RACF 匹配的 import_data 中的相应行匹配。发布一些数据和你得到的结果和你的期望。 【参考方案1】:

尝试如下;获取过滤后的数据并使用该结果集执行JOIN

SELECT tbl_historicOrg.NAME, 
tbl_historicOrg.Racf, 
tbl_historicOrg.STATUS, 
tbl_historicOrg.PCF, 
tbl_historicOrg.[Date Finalized], 
tbl_historicOrg.[Hist Month],
tab.SCHDLE_EXCPT_NM, 
tab.HOURS 
FROM tbl_historicOrg 
LEFT JOIN (
select SCHDLE_EXCPT_NM, 
       HOURS,
       RACF
from import_data where SCHDLE_EXCPT_NM = "System Problems" ) as tab
ON tbl_historicOrg.Racf = tab.RACF;

【讨论】:

您好,感谢您的解决方案。它工作得非常好(除了最后一个导致错误的过滤语句)。它会过滤掉/不包括在小时列中没有数字的任何条目。你知道为什么会这样吗? 基本上,我们需要显示所有的historyOrg 记录(使用上述列),如果适用,还需要一列系统问题。 @jpford,介意用编辑过的查询再试一次。请参阅编辑后的答案。 您的解决方案效果很好。我对导致我现在正在修复的问题的源数据有疑问。再次感谢您的帮助。【参考方案2】:

您的查询应该如下所示,不要对第二个表使用 'WHERE' 子句,它会过滤 'import_data.SCHDLE_EXCPT_NM = "System Problems"' 的数据

SELECT tbl_historicOrg.NAME, tbl_historicOrg.Racf, tbl_historicOrg.STATUS, 
tbl_historicOrg.PCF, tbl_historicOrg.[Date Finalized], tbl_historicOrg.[Hist Month], 
import_data.SCHDLE_EXCPT_NM, import_data.HOURS
FROM tbl_historicOrg LEFT JOIN import_data ON tbl_historicOrg.Racf = import_data.RACF

【讨论】:

以上是关于Access SQL 中的联接语句的主要内容,如果未能解决你的问题,请参考以下文章

复合键中的右联接 - Access SQL

用于 SQL 内部联接的 MS Access 中的括号问题

Access-SQL:与多个表的内部联接

访问 => SQL 联接

Access 上的内部联接 SQL

带有内部联接和子查询的 Microsoft Access 更新语句