2011-04-12 52 views
0

如果這個工程:嵌套INNER JOIN使用MS Access 2003中通過ODBC

SELECT COUNT(t1.ID) AS count FROM Project t1 
INNER JOIN (SELECT DISTINCT t.Site,t.id FROM _Equipment_id t WHERE t.OEM LIKE '%ABC%') t2 ON t1.Site=t2.Site AND t1.id=t2.id 

和這個作品:

SELECT COUNT(t3.ID) AS count FROM Wall t3 
INNER JOIN Project t1 ON t3.Project_number=t1.Project_number 

爲什麼不這項工作:

SELECT COUNT(t3.ID) AS count FROM Wall t3 
INNER JOIN Project t1 ON t3.Project_number=t1.Project_number 
INNER JOIN (SELECT DISTINCT t.Site,t.id FROM _Equipment_id t WHERE t.OEM LIKE '%ABC%') t2 ON t1.Site=t2.Site AND t1.id=t2.id 

最終,我有10個桌子,比如Wall桌子,我試圖從第一個SELECT中獲得總計數。......

+2

你得到什麼錯誤? – Elliott 2011-04-12 19:50:09

+0

我的ASP頁面的客戶端未定義的結果,當SQL語句中存在語法錯誤時,這是​​相同的錯誤。 – shaun5 2011-04-12 19:58:58

回答

1
SELECT COUNT(t3.ID) AS count FROM Wall t3 
INNER JOIN (Project t1 
INNER JOIN (SELECT DISTINCT t.Site,t.id FROM _Equipment_id t WHERE t.OEM LIKE '%ABC%') t2 
ON t1.Site=t2.Site AND t1.id=t2.id) 
ON t3.Project_number=t1.Project_number 

也許這只是一個語法錯誤? Office Help在他們提到嵌套的地方。另一種可能性是別名在某種程度上被作用域,以便它們不可用於連接,但我不熟悉MS Access。也許你應該嘗試完全放棄別名。

+0

這工作!如果我有10個像Wall這樣的具有project_number的表,那麼獲取總數的最簡單的SQL語句是什麼? (在過去,我只是循環訪問數組或表名和總數,使用每個計數) – shaun5 2011-04-12 20:51:07

+0

您可以嘗試在查詢底部添加'UNION',然後使用下一個Wall表重複上述相同的查詢。 'UNION'應該總結所有查詢的結果。如果這不能如預期的那樣工作,您可能需要做COUNT(t3。ID)AS TotalCount','COUNT(t4.ID)AS TotalCount',...,'COUNT(tx.ID)AS TotalCount',這樣別名在所有查詢中保持不變。 – 2011-04-12 21:30:10

+0

謝謝,我希望能夠拿到10個掛錶,union都有一個大表,然後只添加兩個內部連接,但是我無法獲得這種語法。我的foreach循環工作正常,只是看起來很浪費...... – shaun5 2011-04-13 00:25:30

0

你必須與你的代碼了幾個小問題:即以下劃線(_Equipment_id)和AS條款(「別名」)開頭的表名是一個SQL關鍵字(AS count)。當這些被糾正時,你的SQL是有效的SQL-92語法。

不幸的是,問題在於Access(ACE,Jet等)不支持SQL-92標準。 Access堅持每個嵌套的JOIN子句放在括號內。標準SQL允許在括號內使用括號,因爲它可能會改變查詢結果。然而,訪問,不尊重編碼器指定的順序,並允許自己評估以便看到杉木。因此,不僅Access的語法不符合標準,還有功能的喪失!然而,訪問這個進一步的問題將會對這個特定的查詢無不良影響]

您在同一範圍內這裏有兩個JOIN S:

... 
INNER JOIN Project t1 ON t3.Project_number=t1.Project_number 
INNER JOIN 
... 

你的代碼需要通過封閉來解決訪問的問題圓括號中的JOIN;因爲你所有的JOIN都是INNER的味道,所以它們去哪兒都沒關係。

此外,對於糾正你的AS條款,再次訪問不支持SQL標準的引用的標識符(...AS "count"...),並堅持使用其專有的方括號語法(...AS [count]...) - 當然,你可以選擇一個不同的名稱,但可能存在依賴它的應用程序代碼。

代碼要解決這兩個問題的訪問:

SELECT COUNT(t3.ID) AS [count] 
    FROM (Wall t3 
     INNER JOIN Project AS t1 
      ON t3.Project_number = t1.Project_number) 
     INNER JOIN (
        SELECT DISTINCT t.Site,t.id 
        FROM _Equipment_id AS t 
        WHERE t.OEM LIKE '%ABC%' 
       ) AS t2 
      ON t1.Site = t2.Site 
      AND t1.id = t2.id;