【问题标题】:Access Query and VBA SQL returns different data for "Having"Access Query 和 VBA SQL 为“Having”返回不同的数据
【发布时间】:2020-06-21 01:34:26
【问题描述】:

我在查询编辑器中有一个带有以下 SQL 的查询:

SELECT tbl_PN_Import.PN, Last(tbl_PN_Import.Master_PN) AS Master_PN
FROM tbl_PN_Import
GROUP BY tbl_PN_Import.PN
Having (((Last(tbl_PN_Import.Master_PN)) Is Not Null))
ORDER BY tbl_PN_Import.PN;`

它在查询编辑器中返回 10,000 多条记录。

以下是示例记录列表。我们的数据库包含与备用零件号具有一对多关系的主零件号。 PN 字段包含所有部件号,包括主部件号和备用部件号。如果 PN 是主 PN,则它在 Master_PN 字段中没有条目。如果 PN 是替代部件号,则其 Master_PN 位于 Master_PN 字段中。

PN                 Master_PN 
NAS1149FN432P 
AN960-4            NAS1149FN432P 
AD64ALS 
SSPQ-4-3 
SSPQ-04-03         SSPQ-4-3

当我使用 SQL 字符串变量在 VBA 中运行查询时,.OpenRecordSet它只返回第一条记录。当我删除 Having.... 时,它会返回预期的 70,000 多条记录。

我还有其他查询没有 Having... 动词可以正常工作。

感谢任何帮助。

【问题讨论】:

  • 当您将Last 替换为Min(或Max,取决于)时,会发生什么?
  • @Tomalak:当我用 MinMax 替换 Last 时,我得到了 70,000 多条记录。
  • 您能否提供一个包含 10-15 条记录的样本,显示您的表格的外观以及您希望从中获得的结果(即概述您希望使用 GROUP BY 实现的效果和HAVING)?
  • @tomalak 我已将示例记录添加到问题中。
  • 记录集就像一个游标。除非你调用 movenext、movelast 方法,否则你当然会在第一行返回。并且在调用 movelast 方法(或到达记录集的末尾)之前,recordcount 方法不会返回整个记录集的计数。

标签: sql vba ms-access


【解决方案1】:

尝试过滤掉 Null 值:

SELECT tbl_PN_Import.PN, Last(tbl_PN_Import.Master_PN) AS Master_PN
FROM tbl_PN_Import
WHERE tbl_PN_Import.Master_PN Is Not Null
GROUP BY tbl_PN_Import.PN
ORDER BY tbl_PN_Import.PN

或者,作为 Last 只返回“一个值”:

SELECT tbl_PN_Import.PN, Max(tbl_PN_Import.Master_PN) AS Master_PN
FROM tbl_PN_Import
WHERE tbl_PN_Import.Master_PN Is Not Null
GROUP BY tbl_PN_Import.PN
ORDER BY tbl_PN_Import.PN

【讨论】:

  • 感谢您的 SQL!您的第一个 SQL 在查询编辑器中返回 10,435 条记录。这与我在查询编辑器中的 SQL 相同。在 VBA 中,它返回 10,772 条记录......原来是正确的数字。您的第二个 SQL 在查询编辑器和 VBA 中都返回 10,772。我认为 VBA 中的查询编辑器和 SQL 引擎会返回相同的结果!
  • 不知道。我的两个查询都将返回 Master_PN 不为空的那些记录,因此记录数相同。所以,其他事情正在发生。仔细检查您的数据。
【解决方案2】:

LAST 未在未排序的结果集上定义,这意味着任何行都可以。使用子查询强制执行特定顺序,或完全避免使用LAST

子查询的一个例子是:

SELECT PN, Last(Master_PN) AS Master_PN
FROM (SELECT * FROM tbl_PN_Import ORDER BY Some_ID_field)
GROUP BY PN
Having Last(Master_PN) Is Not Null
ORDER BY tbl_PN_Import.PN;

如果您没有 ID 字段或任何可以订购的东西,您就不能指望 LAST 产生一致的结果。

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2019-02-07
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多