MS Access 2016左联接创建重复记录

问题描述

我是MS Access的新手,需要将表2中的“组名”字段添加到表1中(见下文)。

表1列出了所有发票行项目交易。表2按位置和船长列出了定价类别。表2中的组名字段必须与表1中的位置代码匹配,表1中的船长必须在表2中的最小和最大长度之间。

我创建了一个带有左联接的查询,并使用表达式生成器来确保拉入表1中的组名满足表2中的长度要求。

SELECT 
    q_Step2_AMR.*,IIf(
        [HS Boat Length]<=[t_BLG]![Max] And [HS Boat Length]>=[t_BLG]![Min],[t_BLG]![Group Name],"test"
    ) AS [Local Boat Length Group] 
FROM q_Step2_AMR 
LEFT JOIN t_BLG ON q_Step2_AMR.[Location Code] = t_BLG.[Location Code]

问题在于,每当表2中的位置代码与表1中的记录中的位置代码匹配时,就会为表1中的每个记录创建重复记录。

enter image description here

解决方法

查询结果归因于记录的笛卡尔关系。使用WHERE子句:

SELECT q_Step2_AMR.*,t_BLG.[Group Name]
FROM q_Step2_AMR 
LEFT JOIN t_BLG ON q_Step2_AMR.[Location Code] = t_BLG.[Location Code]
WHERE [HS Boat Length] BETWEEN [Min] AND [Max];

请注意,涉及笛卡尔关系的查询在处理大型数据集时可能会缓慢执行。

强烈建议不要使用诸如Min和Max之类的保留字作为任何名称。另外最好不要在命名约定中使用空格。