MS Access上的sql查询溢出错误

时间:2014-10-16 13:34:17

标签: sql ms-access windows-7 ms-access-2010

我需要通过sql查询在MS Access上找到表的列的最大值。

SELECT max( v_difference ) AS max_v_difference
FROM 
(
   SELECT *, vv1 - vv2 AS  v_difference , 
   FROM
   (
     SELECT table3.*  , table1.v1 AS vv1, table2.v1 AS vv2 
     FROM table1, table2, table3
     where table1.id = table2.id and table1.id <> "" and table3.id = table1.id
  )
 ) 

我收到错误:&#34;溢出&#34;

任何帮助将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:1)

我猜测它与您使用最内层子查询执行隐式cross joins这一事实有关。虽然一些SQL引擎会自动优化这些类型的查询,但MS Access不是其中之一。

交叉连接返回两个表的笛卡尔积;笛卡尔积是一个表中每一行与另一个表中每一行的组合。因此,如果table1有1,000行而table2有1,000行,那么这些表的笛卡尔积有1,000 x 1,000 = 1,000,000行。

添加表格时情况会变得更糟。如果table3有10,000行,那么所有三个表的笛卡尔积都是1,000 x 1,000 x 10,0000 = 10,000,000,000行。您可以看到,即使是规模适中的表,如何快速压缩系统资源并导致溢出错误。

执行INNER JOIN时,生成的行集是满足指定JOIN条件的表的交集。这(几乎*)总是导致比CROSS JOIN更小的结果集。

您应该使用INNER JOIN代替。请尝试以下方法:

SELECT max( v_difference ) AS max_v_difference
FROM 
(
   SELECT vv1 - vv2 AS  v_difference
   FROM
   (
     SELECT t1.v1 AS vv1, t2.v1 AS vv2 
     FROM (table1 AS t1 INNER JOIN table2 AS t2 ON t1.id = t2.id)
           INNER JOIN table3 AS t3 ON t1.id = t3.id
     WHERE t1.ID <> ""
  )
 ) 

*可以为每个行组合指定一个总是评估为TRUE的连接条件。在这种情况下,INNER JOIN的结果与CROSS JOIN相同。当然,这样的查询没有现实世界的价值,除了诋毁使用无条件绝对语言的解释,例如,&#34; always&#34; ;)