【发布时间】: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