MS Access 和 SQL 服务器之间的 Max() 行为不同

Posted

技术标签:

【中文标题】MS Access 和 SQL 服务器之间的 Max() 行为不同【英文标题】:Max() Behavior Different Between MS Access and SQL server 【发布时间】:2011-12-14 03:42:34 【问题描述】:

所以我正在将 MS Access 应用程序重写为 SQL Server 后端。我在 Access 使用 MAX() 的方式以及 SQL Server 的执行方式中遇到了一些不寻常的行为。也许是睡眠不足,但我已经盯着这个看了好几个小时,我不明白为什么 SQL 服务器的结果不同。

样本数据:

Acct        ByUser  TranType    TranID      AddID   ClearTime               TranTime
12345678    CZ12           W    55545124    CZ36    12/12/2011 9:45:31 AM   12/12/2011 9:45:31 AM
12345678    CZ24           W    55545124    CZ36    12/12/2011 10:01:26 AM  12/12/2011 10:01:26 AM
12345678    CZ36           W    55545124    CZ36    12/12/2011 9:45:31 AM   12/12/2011 9:45:31 AM
12345678    MG12           W    55545124    CZ36    12/12/2011 10:48:43 AM  12/12/2011 10:48:43 AM
12345678    CZ25           W    55545124    CZ36    12/12/2011 9:45:31 AM   12/12/2011 9:45:31 AM

MS Access 查询:

SELECT Acct, TypeID, TranType
    , Max(TranTime) AS MaxOfTranTime
    , AddID
    , Max(ClearTime) AS MaxOfClearTime
FROM Cleared 
WHERE 
(
    ((ByUser) Like "CZ*" Or (ByUser) Like "TR*" Or 
    (ByUser) Like "RR*" Or (ByUser) Like "MG*" Or 
    (ByUser) Like "RN*" Or (ByUser) Like "PS*" Or 
    (ByUser) Like "OP*" Or (ByUser) Like "JA*" Or 
    (ByUser) Like "IC*" Or (ByUser) Like "IB*" Or 
    (ByUser) Like "FO*" Or (ByUser) Like "DV*" Or 
    (ByUser) Like "CD*" Or (ByUser) Like "BO*" Or 
    (ByUser) Like "2D*")
)
GROUP BY Acct, TypeID, TranType, AddID

访问结果:

Account     TranID    TranType  MaxOfTranTime               AddID   MaxOfClearTime
12345678    55545124    W       12/12/2011  10:48:43 AM      CZ36   12/12/2011 9:45:31 AM

SQL Server 中的查询略有不同,因为我的 ByUser 存储在一个表中,以尽量减少输入大量查询。

SELECT C.Acct
    , C.RequestId
    , C.TypeCode
    , Max(C.TranTime) as MaxTranTime
    , C.AddUserId
    , Max(C.ClearDate) As MaxClearDate
FROM Cleared C
WHERE EXISTS (SELECT *
                FROM UserIdFilter U
                WHERE ByUserId LIKE U.UserId) 
GROUP BY Acct, RequestId, TypeCode, AddUserId

SQL Server 结果是:

Account     TranID    TranType  MaxOfTranTime          AddID    MaxOfClearTime
12345678    55545124    W      12/12/2011  10:48:43 AM  CZ36    12/12/2011  10:48:43 AM

当我经历这个时,在我看来 SQL 服务器在获取 12/12/2011 10:48:43 AM 的 MaxOfClearTime 是正确的,但我错过了什么吗? Access 处理MAX() 是否不同?我觉得我正在为此失去理智,所以任何其他人对此的看法都会很棒。

【问题讨论】:

似乎第一次你使用 'Max(ClearTime) AS MaxOfClearTime' 而第二次你使用 'Max(C.ClearDate) As MaxReasClearDate' @ysrb 他们是一样的,我只是把它复制错了,查询、数据在发布到任何网站之前都需要清理。我改正了 运行“SELECT * FROM UserIdFilter U WHERE ByUserId LIKE U.UserId”是否会为您提供与第一个查询中相同的值?? @MitchWheat 是的,我在第一个查询中得到了相同的值。完全相同的记录数等。 【参考方案1】:

我将您提供的数据放入 Access 并运行查询,它提供了我期望的输出,即 10 > 9

当然,我确实假设 ClearTime 和 TranTime 都存储为 DateTime,如果我将它们更改为 Text 并更改格式以匹配您的示例,那么我会得到与您相同的结果,即 "9" > "10"

您能在 MS Access 中检查表的架构吗?

【讨论】:

这为我指明了正确的方向。它是访问中的文本字段,而不是日期字段。

以上是关于MS Access 和 SQL 服务器之间的 Max() 行为不同的主要内容,如果未能解决你的问题,请参考以下文章

重新定义 MS Access 文件和 SQL Server 之间的数据链接

从 MS SQL SERVER 和 MS ACCESS 调用存储过程的结果之间的差异

C# 和 MS Access 之间的数据类型不匹配?

在 MS Access 或 SQL Server 中查找 2 个表之间的差异

在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异

更新查询的 MS Access SQL 错误