【发布时间】:2014-03-17 05:18:13
【问题描述】:
我在 Access 中有一个查询,它从两个表中返回数据。但是,需要过滤一个表,因为我需要返回特定日期的最新条目。
我通过从另一个查询复制 SQL 然后在设计视图中修改它来创建查询。当我从设计视图保存查询并运行它时,我得到了一个三列表的预期结果,其中包含每个 StaffNumber 的每个 ShiftType 的总计。但是,当我将查询移到我的 VBA 应用程序时,它会引发错误。此外,当我在 SQL 视图中查看查询并对其进行修改(添加然后删除空格)时,它会引发错误。
查询SQL为:
SELECT DataLeave.StaffNumber, TABLE1.ShiftType, Count(TABLE1.ShiftType) AS CountOfShiftType
FROM DataLeave INNER JOIN [SELECT DataShifts.StaffNumber, ShiftType, DataShifts.ShiftDate
FROM DataShifts
INNER JOIN [SELECT StaffNumber, ShiftDate, MAX(ID) AS IDMAX FROM DataShifts GROUP BY DataShifts.StaffNumber,DataShifts.ShiftDate]. AS FILTER ON DataShifts.ID = FILTER.IDMAX]. AS TABLE1 ON (DataLeave.LeaveDate = TABLE1.ShiftDate) AND (DataLeave.StaffNumber = TABLE1.StaffNumber)
WHERE (((DataLeave.Active)=True) AND ((DataLeave.LeaveDate) Between #9/3/2013# And #3/15/2014#) AND ((DataLeave.StaffNumber)='2537860')) OR (((DataLeave.StaffNumber)='2524710')) OR (((DataLeave.StaffNumber)='2515610') AND ((DataLeave.LeaveTypeShort) Like '*FD'))
GROUP BY DataLeave.StaffNumber, TABLE1.ShiftType
ORDER BY DataLeave.StaffNumber;
我得到的错误是:
查询表达式“DataShifts.ID = FILTER.IDMAX] 中的语法错误。 AS TABLE1 ON (DataLeave.LeaveDate = TABLE1.ShiftDate)'
我设计了另一个使用 IN 工作的查询,但它非常慢,所以我想让它工作,但到目前为止没有任何调整。
VBA 代码是:
q = "SELECT DataLeave.StaffNumber, TABLE1.ShiftType, Count(TABLE1.ShiftType) AS CountOfShiftType "
q = q + "FROM DataLeave INNER JOIN [SELECT DataShifts.StaffNumber, ShiftType, DataShifts.ShiftDate "
q = q + "FROM DataShifts "
q = q + "INNER JOIN [SELECT StaffNumber, ShiftDate, MAX(ID) AS IDMAX FROM DataShifts GROUP BY DataShifts.StaffNumber,DataShifts.ShiftDate]. AS FILTER ON DataShifts.ID = FILTER.IDMAX]. AS TABLE1 ON (DataLeave.LeaveDate = TABLE1.ShiftDate) AND (DataLeave.StaffNumber = TABLE1.StaffNumber) "
q = q + "WHERE (((DataLeave.Active)=True) AND ((DataLeave.LeaveDate) Between #9/3/2013# And #3/15/2014#) AND ((DataLeave.StaffNumber)='2537860')) OR (((DataLeave.StaffNumber)='2524710')) OR (((DataLeave.StaffNumber)='2515610') AND ((DataLeave.LeaveTypeShort) Like '*FD')) "
q = q + "GROUP BY DataLeave.StaffNumber, TABLE1.ShiftType "
q = q + "ORDER BY DataLeave.StaffNumber;"
Set Rs = Db.OpenRecordset(q)
使用 DAO
【问题讨论】:
-
您使用的是 Access 2003 或更早版本吗?
-
同时使用 Access 2003 和 2010