我猜它有你與你最裏面的子查詢執行隱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相同。當然,這樣的查詢將沒有現實世界的價值,除了詆譭使用無條件絕對語言的解釋,例如「永遠」)。
爲什麼不在table1,table2和table3之間加入? – PaulFrancis 2014-10-16 13:43:46