【问题标题】:MS Access 2016 left join creating duplicate recordsMS Access 2016 左连接创建重复记录
【发布时间】:2021-01-11 06:00:01
【问题描述】:

我是 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 中的每条记录创建重复记录。

【问题讨论】:

  • 请以文字(而非图片)形式向我们展示您当前的查询。
  • 我想这就是你要找的。在我之前的示例中,查询 q_Step2_AMR 是表 1,t_BLG 是表 2。我正在尝试使用 Access 函数而不是 SQL 来解决问题。 SELECT q_Step2_AMR.*, IIf([HS 船长]=[t_BLG]![Min],[t_BLG]![Group Name],"test") AS [本地船长组] FROM q_Step2_AMR LEFT JOIN t_BLG ON q_Step2_AMR.[Location Code] = t_BLG.[Location Code];
  • edit your question添加这条重要信息。
  • 您似乎想要“对齐”行。这在 MS Access 中并非易事。您可能需要考虑切换到功能更全面的数据库...

标签: sql ms-access left-join ms-access-2016


【解决方案1】:

查询结果是由于记录的笛卡尔关系。使用 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 等保留字作为任何名称。最好不要在命名约定中使用空格。

【讨论】:

  • 感谢您的帮助!结果查询最初缺少船长字段为空白的记录,但我想出了一个解决方法。
  • 如果字段为空,可以使用 Nz() 或 IIf() 函数提供一个值,例如 0。如果回答解决了问题,请标记为接受。
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2017-11-15
  • 2011-08-09
  • 2015-11-23
相关资源
最近更新 更多