问题是:我在查询中收到“无效操作”错误LEFT JOIN
,尽管我认为我可以识别导致问题的字段,但我无法弄清楚为什么以及如何修复它。我遗漏了什么/我需要更改什么才能使其正常工作?
我正在处理 4 个链接表,它们进入 2 个不同的选择查询(ex_Step1
和ex_Step2
),然后这两个查询进入第三个查询(ex_Step3
)。当我尝试运行第三个查询时,出现“无效操作”错误。除了以下情况外,我不会修改任何原始数据:
Switch
将系统生成的代码转换为项目名称,以方便人们阅读Sum
将两个不同的数字相加Trim
删除工作订单号的尾部空格
以下是对查询应执行的操作的解释:
- 我们有 NCR(不合格记录),可能会创建 WO(工作单)来做一些维修或返工活动,纠正问题所在
- 并非每个 NCR 都会创建 WO,也并非每个 WO 都是由 NCR 创建的
- NCR 表有一个字段,用于记录是否创建了 WO,以及有关 NCR 的其他信息
- WO 表记录了完成这项工作所花费的所有时间,但没有记录 NCR 编号所对应的字段
- 我必须根据 WO 编号链接 NCR 数据和 WO 数据
- 我想提取由 NCR 创建的每个 WO 的所有小时数,并将其与 NCR 关闭的日期联系起来
ex_Step1
提取每个 WO 的数据,其编号以 开头,N
因为每个由 NCR 创建的 WO 都会获得一个以 开头的编号N
ex_Step2
提取与以以下开头的工作订单相关的每个 NCR 的数据N
ex_Step3
是应该提取来自的每条记录ex_Step1
,如果 WO 编号出现在 中ex_Step2
,则应提取 NCR 信息,如编号、创建日期和关闭日期- 如果 WO 以
N
NCR 表开头但没有相应的条目,我计划使用该DATE_MC
字段,ex_Step1
但我还没有走得太远以至于这不会成为一个问题。
以下是我根据迄今为止所做的故障排除和一些支持想法发现的一些事情:
- 仅当左侧
ex_Step3
使用LEFT JOIN
with时才会出现错误。常规连接没有问题,左侧使用 with 连接也没有问题。ex_Step1
ex_Step2
- 在
JOIN
字段ex_Step1.tWO_NBR
和上ex_Step2.tWO_NK
。(两个底层链接表对相同数据有不同的名称) Trim
这两个是应用于它们的两个字段(在ex_Step1
和中ex_Step2
),因为一个表有尾随空格而另一个没有,所以连接只在删除空格的情况下才有效- 如果我使用
LEFT JOIN
但不包含右侧表中的任何记录(ex_Step2
),则ex_Step3
运行不会出错。我推测这是因为它忽略了连接,因为我们只从左表中提取数据。 - 我尝试将
ON
语句括在括号中 - 如下面的 SQL 所示 - 但没有效果
这是查询的 SQL。我已清理数据以删除项目名称,但我没有做其他更改。对于ex_Step1
:
SELECT WDS17_ORD.STKRM, Switch([STKRM]="14","Proj1",[STKRM]="16","Proj2",[STKRM]="26","Proj3",[STKRM]="28","Proj4") AS Project, Trim([WO_NBR]) AS tWO_NBR, WDS17_LDD.WO_ACCT, WDS17_ORD.DATE_MC, Sum([WDS17_LDD]![HRS_REG]+[WDS17_LDD]![HRS_OT1]) AS Hours
FROM WDS17_LDD RIGHT JOIN WDS17_ORD ON WDS17_LDD.WO_ACCT = WDS17_ORD.WO_NBR
GROUP BY WDS17_ORD.STKRM, Switch([STKRM]="14","Proj1",[STKRM]="16","Proj2",[STKRM]="26","Proj3",[STKRM]="28","Proj4"), Trim([WO_NBR]), WDS17_LDD.WO_ACCT, WDS17_ORD.DATE_MC
HAVING (((WDS17_ORD.STKRM)="14" Or (WDS17_ORD.STKRM)="16" Or (WDS17_ORD.STKRM)="26" Or (WDS17_ORD.STKRM)="28") AND ((Trim([WO_NBR])) Like "N*") AND ((Sum([WDS17_LDD]![HRS_REG]+[WDS17_LDD]![HRS_OT1]))>0))
ORDER BY Switch([STKRM]="14","Proj1",[STKRM]="16","Proj2",[STKRM]="26","Proj3",[STKRM]="28","Proj4"), WDS17_ORD.DATE_MC DESC , Sum([WDS17_LDD]![HRS_REG]+[WDS17_LDD]![HRS_OT1]) DESC;
... 以及ex_Step2
:
SELECT Trim([REWORK_WO_NK]) AS tWO_NK, DW_OWNER_NCM_DISP_REWORK_WO_FACT.NCR_NUMBER_NK AS NCR_NUMBER, DW_OWNER_NCM_NCR.DATE_CREATE, DW_OWNER_NCM_NCR.DATE_CLOSE
FROM DW_OWNER_NCM_DISP_REWORK_WO_FACT INNER JOIN DW_OWNER_NCM_NCR ON DW_OWNER_NCM_DISP_REWORK_WO_FACT.NCM_NCR_SK = DW_OWNER_NCM_NCR.NCM_NCR_SK
GROUP BY Trim([REWORK_WO_NK]), DW_OWNER_NCM_DISP_REWORK_WO_FACT.NCR_NUMBER_NK, DW_OWNER_NCM_NCR.DATE_CREATE, DW_OWNER_NCM_NCR.DATE_CLOSE
HAVING (((Trim([REWORK_WO_NK])) Like "N*"))
ORDER BY DW_OWNER_NCM_NCR.DATE_CREATE, DW_OWNER_NCM_NCR.DATE_CLOSE;
... 以及ex_Step3
:
SELECT ex_Step1.STKRM, ex_Step1.Project, ex_Step1.tWO_NBR, ex_Step1.WO_ACCT, ex_Step1.DATE_MC, ex_Step1.Hours, ex_Step2.NCR_NUMBER, ex_Step2.DATE_CREATE, ex_Step2.DATE_CLOSE
FROM ex_Step1 LEFT JOIN ex_Step2 ON (ex_Step1.tWO_NBR = ex_Step2.tWO_NK);
答案1
发布此答案是为了避免问题悬而未决且得不到解答,以便为后代提供参考。
我尝试了评论中建议的完全外部连接,但无法使其工作。它不是在 Access 2010 中原生实现的,我找到的解决方法都没有成功。我最终的解决方案是将我的基本查询设置为 Make Table 查询,并使用表作为我的第三个查询的源。对于我的实现来说,这就足够了。