首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ms access查询(ms access冻结)

ms access查询(ms access冻结)
EN

Stack Overflow用户
提问于 2018-09-13 19:30:27
回答 1查看 1.9K关注 0票数 2

我有这份报告,需要为每个人添加总数(红圈) 现有报告

新报告

我无法更改现有的报告,因此我将数据从MS导出到MS,并在那里创建一个新的报告。我让它为一名员工工作,但在查询时遇到了问题,这个查询会针对多名员工。

此查询提取数据用作输入:

代码语言:javascript
复制
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));

此查询填充报表:

代码语言:javascript
复制
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,如下所示

代码语言:javascript
复制
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会冻结。

有什么帮助/想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-14 05:07:56

警告:我不会假装知道问题的确切原因,但是我不得不在访问过程中反复重构查询,以使它们工作,即使原始的SQL语句在语法和逻辑上完全有效。有时,为了避免访问中的错误,我不得不对一系列的查询进行纠结。访问通常相当愚蠢,只需(重新)执行查询和子查询,完全按照给定的方式执行,而不进行优化。在其他时候,Access会尝试通过执行一些内部优化来组合查询,但有时会引入令人沮丧的bug。像名称更改或列重新排序这样简单的内容可能是功能查询与崩溃或冻结访问的查询之间的区别。

首先要考虑:

  • 您能否将数据留在Server上并链接到Access中的结果(而不是导出/导入到Access中)?即使您需要或更愿意使用Access来创建实际的报表,您也可以使用SQL Server的所有功能来查询数据--它可能更少错误,效率更高。
    • 常见的最佳实践是创建返回访问中所需数据的Server存储过程。在Access中创建一个传递查询以检索数据,但所有数据操作都在服务器上执行。

  • 也许这只是一个性能问题,[EMP_ID]限制set选择一个小子集,但是完整的表足够大,足以“冻结”访问。
    • 在终止程序之前,您让访问被冻结了多长时间?耐心点..。就像很多很多分钟(或小时)一样。早上开始,午饭后再检查。)它可能最终返回一个结果集。这并不意味着它是可以容忍的,或者没有其他解决方案,但是知道它最终是否返回数据可能是有用的。
    • 有多少可能的记录?
    • 导入的数据是否正确地编入索引?向所有关键字段和WHERE子句中使用的字段添加索引。
    • 数据库是位于网络共享上,还是位于本地?尝试将数据库复制到本地驱动器。

其他暗示:

  • 尝试WHERE子句中日期的中间操作符。

尝试通过在FROM子句而不是WHERE子句中执行联接来重构“第二个”查询。在这样做时,您还可能希望将子查询保存为命名查询(就像保存[TIME1]一样)。无论查询是否保存或嵌入到另一个语句中,都会改变访问的行为(请参阅警告),尽管结果应该是相同的。

下面是一个带有嵌入式聚合查询的版本。注意所有列引用是如何使用源限定的。一些原始查询的列没有以列名为前缀的源别名。记住警告..。这些挑剔的细节会影响访问行为:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52320572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档