2014-10-16 77 views
0

我需要通過sql查詢找到MS Access上表的列的最大值。MS Access上sql查詢的溢出錯誤

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 
) 
) 

我得到了錯誤: 「溢出」

任何幫助,將不勝感激。

感謝

+0

爲什麼不在table1,table2和table3之間加入? – PaulFrancis 2014-10-16 13:43:46

回答

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時,生成的行集是滿足指定連接條件的表的交集。這個(幾乎*)總是會導致比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相同。當然,這樣的查詢將沒有現實世界的價值,除了詆譭使用無條件絕對語言的解釋,例如「永遠」)。