【问题标题】:Max() Behavior Different Between MS Access and SQL serverMS Access 和 SQL 服务器之间的 Max() 行为不同
【发布时间】: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 是的,我在第一个查询中得到了相同的值。完全相同的记录数等。

标签: sql-server ms-access aggregate-functions ms-access-2003


【解决方案1】:

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

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

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

【讨论】:

  • 这为我指明了正确的方向。它是访问中的文本字段,而不是日期字段。
猜你喜欢
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 2014-06-03
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多