【问题标题】:Why do I get multiple results from a MAX SQL query?为什么我会从 MAX SQL 查询中获得多个结果?
【发布时间】:2022-01-11 11:13:28
【问题描述】:

在 Access 中,我有一个名为 tblBundle 的表,我试图查询在订单中的每个捆绑包上完成的最后一步。

tblBundle 包含:工单、Bundle#、BundleLtr、Step、Complete [boolean]

我最终想将其复制到 vba 中以创建 Bundle #、Ltr 和上一步完成的列表,以便在下一步完成时继续输入数据。

由于某种原因我无法确定,下面的 SQL 查询在我认为它应该只返回一条记录 - 200 时返回捆绑 1 (190, 200) 的 2 条记录。

SELECT Max(tblBundle.Step) AS intLstep, tblBundle.BundleNbr, tblBundle.BundleLtr, 
tblBundle.Complete
FROM tblBundle
GROUP BY tblBundle.WO, tblBundle.BundleNbr, tblBundle.BundleLtr, tblBundle.Complete
HAVING (((tblBundle.WO)="195687-1-1") AND ((tblBundle.Complete)=True));

谁能帮我弄清楚为什么我的查询返回了额外的值?

【问题讨论】:

  • 这两条记录之间的BundleLtr 可能存在不可见的差异。例如。一个为空,另一个为空字符串。
  • 有趣的是它们都是空的并且通过缩放窗口确认。此外,Bundle 2 的记录与 Bundle 1 完全相同,因为它们是复制和粘贴的。所以我很好奇为什么 Bundle 2 也没有出现 190
  • 我不是 Access 用户,所以我不确定“缩放窗口”是什么,但我很难相信前两条记录在BundleNbrBundleLtr
  • @samwiseVB 确认聚合查询结果中是否有空字符串或空字符串或两者兼有的最佳方法是在 tblBundle 中显式查询它们。为此,我不相信缩放窗口。
  • 缩放是当您单击单元格时,shift+f2 会打开一个更大的单元格窗口。此外,在过滤字段时,选项是(空白)、a、b

标签: sql vba ms-access


【解决方案1】:

在 MsAccess 中,在数据表视图中查看时,NULL 值显示为空白。此外,似乎当在数据表视图中为 ShortText 列输入空格时,它们会变成 NULL(在我的 MsAccess 版本上)。似乎您的数据对于其中一个步骤(例如 200)可能有 NULL,而对于另一个步骤(例如步骤 190)可能有空格(零或更多),您可以强制查询以相同的方式处理两者:

SELECT Max(tblBundle.Step) AS intLstep, tblBundle.BundleNbr,
 nz(tblBundle.BundleLtr,'') as BundleLtr,
 tblBundle.Complete
FROM tblBundle
GROUP BY tblBundle.WO, tblBundle.BundleNbr,
         nz(tblBundle.BundleLtr,''), tblBundle.Complete
HAVING (((tblBundle.WO)="195687-1-1") AND ((tblBundle.Complete)=True));

请注意,不可见字符实际上可以是看起来像空格的字符,但实际上不是(如不间断空格)等。如果上述解决方案不起作用,请尝试以下操作:

SELECT  asc(mid(BundleLtr, 1,1)), asc(mid(BundleLtr, 2,1)) FROM Table2 where Step=190

查看该列中数据的 ascii 值。

【讨论】:

  • 这很简单,谢谢!
【解决方案2】:

似乎是因为您的查询正在分解结果,并且返回 BundleNbr 导致它同时占用 Max,因为它是有效的。

您还可以在 Group By 语句中对此进行分解并按此汇总。

值 190 和 200 的 BundleNbr 均为 1。如果删除该列,您将获得 200 的实际最大值(如果您想要 intLStep 的最大值。

【讨论】:

  • 我希望查询返回 BundleNbr/Ltr 以及在每个捆绑包 #/Ltr 组合上完成的最后一步。除了 Bundle 1 Step 190 之外,返回的值都是正确的。确认 BundleLtr 对于两个条目都为 Null
【解决方案3】:

我能够使用以下函数来“清理”我的字符串并删除额外的“Bundle 1”。这不能解决最初的问题,但适用于我的目的。

'[Removes duplicate values from a string]
Function DeDupeString(ByVal sInput As String, Optional ByVal sDelimiter As 
String = ",") As String

Dim varSection As Variant
Dim sTemp As String

For Each varSection In Split(sInput, sDelimiter)
    If InStr(1, sDelimiter & sTemp & sDelimiter, sDelimiter & varSection & sDelimiter, vbTextCompare) = 0 Then
        sTemp = sTemp & sDelimiter & varSection
    End If
Next varSection

DeDupeString = Mid(sTemp, Len(sDelimiter) + 1)

End Function

发现自:Removing Duplicate values from a string in VBA

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 2020-03-24
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多