【问题标题】:Access giving error in SQL view but query runs correctly访问在 SQL 视图中给出错误但查询运行正确
【发布时间】: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

标签: sql ms-access vba


【解决方案1】:

Access SQL 接受 2 种样式的子查询括号:

  1. [statement]. AS alias
  2. (statement) AS alias

两者都可以,但是当子查询语句包含方括号时,第一种形式可能会中断。由于您的第一个子查询包含另一个子查询,该子查询包含在另一对方括号中,我认为这可能是问题的原因。

此外,您还有一个reserved wordFILTER 作为别名。这可能会在以后产生另一个问题。

我建议你将这个 SQL 保存为一个新的 Access 查询,qryFilter

SELECT
    DataShifts.StaffNumber,
    DataShifts.ShiftDate,
    MAX(DataShifts.ID) AS IDMAX
FROM DataShifts
GROUP BY
    DataShifts.StaffNumber,
    DataShifts.ShiftDate

然后您可以修改主查询以使用 qryFilter 而不是子查询语句。

SELECT
    dl.StaffNumber,
    t1.ShiftType,
    Count(t1.ShiftType) AS CountOfShiftType
FROM
    DataLeave AS dl
    INNER JOIN
        (
            SELECT
                ds.StaffNumber,
                ds.ShiftType,
                ds.ShiftDate 
            FROM
                DataShifts AS ds
                INNER JOIN qryFilter AS fltr
                ON ds.ID = fltr.IDMAX
        ) AS t1
    ON
            (dl.LeaveDate = t1.ShiftDate)
        AND (dl.StaffNumber = t1.StaffNumber)
WHERE
        dl.Active=True
    AND dl.LeaveDate Between #9/3/2013# And #3/15/2014#
    AND dl.StaffNumber IN ('2537860', '2524710', '2515610')
    AND dl.LeaveTypeShort Like '*FD'
GROUP BY
    dl.StaffNumber,
    t1.ShiftType
ORDER BY dl.StaffNumber;

注意事项:

  1. 我忘记了 WHERE 子句的逻辑,所以如果我弄错了,您可能需要修复它。
  2. 我为子查询使用了第二种样式,括号。如果您在 Access 2003 的查询设计器中修改查询,它可能(可能会)将它们切换为方括号。但是,由于此时只有一对方括号,因此不应中断查询。
  3. 最后,如果您在每个子查询语句周围使用圆括号而不是方括号,您可以使您的原始语句工作。然后只需确保每次 Access 2003 查询设计器切换到方括号时切换回括号。 (小心!)

【讨论】:

    【解决方案2】:

    最后是分号...

    尝试在“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"
    

    【讨论】:

    • 对不起,这没有用。我实际上并不关心 VBA 方面,更多的是 Access 中的 SQL 视图引发错误,所以我确定查询本身存在问题,而不是我在 VBA 中如何使用它。
    • 对不起,我当时有点困惑。只是为了检查 1) 你有一个查询可以访问它的一切都很好 2) 如果你将 SQL 复制到 VBA 它会中断 3) 如果你编辑 SQL - 例如只是删除一个空格 - 它会中断
    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多