2013-05-30 68 views
1

我有访问查询确实需要时间来执行。现在,我必须经过至少四次查询才能得到我想要的结果,这个结果是小组排名前四的。这里是查询。优化或简化MS Access查询

  1. Query1 - 添加第3列的计算字段。
  2. 查询2 - 为列3添加累积字段。
  3. Query3 - 添加我在其中使用column3进行计算的计算字段。 calcfield1,calcfield2,calcfield3使用UNION查询将它们组合到一列(NewColumn)中。总结NewColumn并按GroupID对它们进行分组。
  4. Query4 - 按GroupID在NewColumn中选择前4个值。

样本输出(顶部通过的GroupID 4个值NewColumn的):

Group1 1.45 
Group1 1.00 
Group1 0.45 
Group1 0.20 
Group2 8.20 
Group2 4.48 
Group2 3.44 
Group2 2.00 

当运行Query4,需要一段时间来执行(至少10分钟)。由于累计百分比计算,查询必须返回所有记录。

我在Query3中尝试了HAVING子句,这样Query4中的行将被最小化,当我选择Top 4但我无法得到它的工作。我也尝试过在Query2中获得前四名,以便后续查询有更少的行来处理,但查询需要更多时间,我不得不中断查询的执行。

我想简化或至少优化查询。

表结构:

Table1: 
ID - Autonumber 
GroupID 
Tip1 
Tip2 
Tip3 
Tip4 

Sample data Table1: 
GroupID Tip1  Tip2  Tip3  Tip4 
171  1   5   4   8 
172  2   7   5   3 
173  8   16   10   

Table2: 
ID - Autonumber 
GroupID 
Result1 
Result2 
Result3 

Sample data Table2: 
GroupID Result1 Result2  Result3 
171  1   5   4  
172  12   7   5  
173  8   6   3 

Table 1和表2是使用群ID

+0

你可以显示你的表结构和一些样本输入数据吗 – rene

+0

是的,Query3一定是瓶颈,因为三个字段合并成一个。如果我可以在Query3中按组获得前4名,则可以消除Query4。但我不知道该怎么做,因为我必须在Select Top 4子查询中使用HAVING子句。 – matley

+0

更新:只有Query4非常慢。其他查询在合理的时间内返回记录。 – matley

回答

1

加入我也有类似的情况曾经在那里我有经过复杂的自联接排名数据。这是非常缓慢的,直到我第一次将数据转储到临时表中,然后在其上运行更新查询。仍然很慢,但并不差。

也许你可以使用临时表而不是一系列连接的查询?然后,#1,#2和#3可以作为在该登台表上作用的更新查询。

+0

我实际使用#3的登台表。没有尝试过#1和#2。会试试看。 – matley

+0

顺便说一句,如何更新更改并在临时表上插入新记录?我的意思是,我如何捕捉实际表格上的变化,以便更改反映在临时表上? – matley

+0

这并不难。你的问题基本上转化为“我如何在Access中进行更新查询?”所以请尝试使用谷歌搜索。例如,在创建登台表(可能使用生成表查询)时,为“Column3”包含一个空白字段,然后使用更新查询填充它。 – PowerUser