我有这份报告,需要为每个人添加总数(红圈) 现有报告。
我无法更改现有的报告,因此我将数据从MS导出到MS,并在那里创建一个新的报告。我让它为一名员工工作,但在查询时遇到了问题,这个查询会针对多名员工。
此查询提取数据用作输入:
SELECT [TIME].[RCD_NUM], [TIME].[EMP_ID], [TIME].[PPERIOD], [TIME].[PRUN], [TIME].[TDATE], [TIME].[PC], [TIME].[RATE], [TIME].[HOURS], [TIME].[AMOUNT], [TIME].[JOB_ID], [TIME].[UPDATED], [TIME].[UPDATED_BY], [TIME].[LOG_DATE], [TIME].[ORIGINAL_REC_NUM]
FROM [TIME]
WHERE ((([TIME].[EMP_ID])=376) And (([TIME].[TDATE])<=#12/31/2006# And ([TIME].[TDATE])>=#1/1/2006#) And (([TIME].[PC])<599));此查询填充报表:
SELECT *
FROM TIME1
WHERE RCD_NUM = (SELECT Max(RCD_NUM) FROM [TIME1] UQ WHERE UQ.PPERIOD = [TIME1].PPERIOD AND UQ.PC = [TIME1].PC);问题是,如果我从第一个查询中删除EMP_ID,如下所示
SELECT [TIME].[RCD_NUM], [TIME].[EMP_ID], [TIME].[PPERIOD], [TIME].[PRUN], [TIME].[TDATE], [TIME].[PC], [TIME].[RATE], [TIME].[HOURS], [TIME].[AMOUNT], [TIME].[JOB_ID], [TIME].[UPDATED], [TIME].[UPDATED_BY], [TIME].[LOG_DATE], [TIME].[ORIGINAL_REC_NUM]
FROM [TIME]
WHERE ((([TIME].[TDATE])<=#12/31/2006# And ([TIME].[TDATE])>=#1/1/2006#) And (([TIME].[PC])<599));然后,第二个查询不能工作,运行此查询时,和ms access会冻结。
有什么帮助/想法吗?
发布于 2018-09-14 05:07:56
警告:我不会假装知道问题的确切原因,但是我不得不在访问过程中反复重构查询,以使它们工作,即使原始的SQL语句在语法和逻辑上完全有效。有时,为了避免访问中的错误,我不得不对一系列的查询进行纠结。访问通常相当愚蠢,只需(重新)执行查询和子查询,完全按照给定的方式执行,而不进行优化。在其他时候,Access会尝试通过执行一些内部优化来组合查询,但有时会引入令人沮丧的bug。像名称更改或列重新排序这样简单的内容可能是功能查询与崩溃或冻结访问的查询之间的区别。
首先要考虑:
[EMP_ID]限制set选择一个小子集,但是完整的表足够大,足以“冻结”访问。
其他暗示:
尝试通过在FROM子句而不是WHERE子句中执行联接来重构“第二个”查询。在这样做时,您还可能希望将子查询保存为命名查询(就像保存[TIME1]一样)。无论查询是否保存或嵌入到另一个语句中,都会改变访问的行为(请参阅警告),尽管结果应该是相同的。
下面是一个带有嵌入式聚合查询的版本。注意所有列引用是如何使用源限定的。一些原始查询的列没有以列名为前缀的源别名。记住警告..。这些挑剔的细节会影响访问行为:
SELECT TIME1.*
FROM TIME1 INNER JOIN
(SELECT UQ.PPERIOD, UQ.PC, Max(UQ.RCD_NUM) As Max_RCD_NUM
FROM [TIME1] UQ
GROUP BY UQ.PPERIOD, UQ.PC) As TIMEAGG
ON (TIME1.PPERIOD = TIMEAGG.PPERIOD) And (TIME1.PC = TIMEAGG.PC)
AND (TIME1.RCD_NUM = TIMEAGG.Max_RCD_NUM)https://stackoverflow.com/questions/52320572
复制相似问题