2016-11-29 55 views
1

我正嘗試使用連接來連接MS Access中的多個表以獲取計數值。但我不知道它給出錯誤的計數值。如果我嘗試單獨加入它們,那麼它會給我正確的計數值。SQL內部連接在MS ACCESS中給出不正確的計數值

我有3個表格。表2和表3是獨立的,並連接到表1.測試2和測試3基本上是文本值,我想對行進行計數。

表1(ID1(主鍵),名稱) 表2(ID2(主鍵),ID1(外鍵)的Test2) 表3(ID3(Orimary鍵),ID1(外鍵),Test3的)

,我從MS Access得到查詢下面給出:

SELECT Table1. ID1, Count(Table2.Test2) AS CountOfTest2, Count(Table3.Test3) AS CountOfTest3 
FROM (Table1 INNER JOIN Table2 ON Table1.ID1 = Table2.ID2) 
INNER JOIN Table3 ON Table1. ID1 = Table3.ID3 
GROUP BY Table1.ID1; 

但是這給了我錯誤的計數值。 有人可以幫助我嗎。

謝謝。

+2

計數正在被1-M關係的加入連接誇大。因此,您需要在最終表連接之前通過內聯查詢/視圖來獲取計數,或者,如果訪問支持它,則爲count(Distinct table2。test2)'因此在連接之前統計不同的唯一字段值,從而消除由連接引起的重複。 – xQbert

+0

只是爲了澄清@xQbert的陳述;它不是訪問問題,它在涉及一個或多個1-M關係的多個連接中是固有的和預期的行爲,在所有類型的SQL中都是如此。 – Uueerdo

回答

0

如果我可以假設測試2和測試3是唯一的

SELECT Table1.ID1 
    , Count(distinct Table2.Test2) AS CountOfTest2 
    , Count(distinct Table3.Test3) AS CountOfTest3 
FROM Table1 
INNER JOIN Table2 
    ON Table1.ID1 = Table2.ID2 
INNER JOIN Table3 
    ON Table1.ID1 = Table3.ID3 
GROUP BY Table1.ID1; 

,或者您可能獲得的計數的每個記錄(也許它會更好地算PK?)的加入,雖然在使用前內聯視圖。如果MSSQL SERVER但Access需要內聯視圖,則可以使用窗口函數。

SELECT A.ID1 
    , B.CountOfTest2 
    , C.CountOfTest3 
FROM Table1 A 
INNER JOIN (SELECT Table2.ID2, count(table2.test) as CountOfTest2 
      FROM Table2 
      GROUP BY Table2.id) B 
    ON Table1.ID1 = B.ID2 
INNER JOIN (SELECT Table3.id, count(table3.test3) as CountOfTest3 
      FROM Table3 
      GROUP BY Table3.id) C 
    ON B.ID1 = C.ID3 
GROUP BY A.ID1; 
+0

感謝您的回覆。我嘗試了這些,但它不起作用,並且因爲使用MS訪問而給我語法錯誤。只是爲了說明表1與表2有1:M的關係,表1也有1:M與表3。我正在使用PK加入我的以前的查詢。 SELECT Table1。 (Table1.Test2)AS CountOfTest2,Count(Table3.Test3)AS CountOfTest3 FROM(Table1 INNER JOIN Table2 ON Table1.ID1 = Table2.ID1) INNER JOIN Table3 ON Table1。 ID1 = Table3.ID1 GROUP BY Table1.ID1 – user7227726

+0

我覺得很奇怪,最後一個失敗。你得到什麼錯誤? oops缺少內部聯接文本。 – xQbert

+0

它給我語法錯誤,就這些。 – user7227726

0

當我單獨使用它,它給了我正確的計數值:

選擇table1。 ID1,Count(Table2.Test2)AS CountOfTest2 FROM Table1 INNER JOIN Table2 ON Table1.ID1 = Table2.ID1 GROUP BY Table1.ID1;

SELECT Table1。 ID1,Count(Table3.Test3)AS CountOfTest3 FROM Table1 INNER JOIN Table3 ON Table1.ID1 = Table3.ID1 GROUP BY Table1.ID1;

但是,當我嘗試加入表1,表2和表3中的MS艾策斯,它給了我不正確的計數值。

SELECT Table1。 ID1,Count(Table2.Test2)AS CountOfTest2,Count(Table3.Test3)AS CountOfTest3 FROM(Table1 INNER JOIN Table2 ON Table1.ID1 = Table2.ID1)INNER JOIN Table3 ON Table1。 ID1 = Table3.ID1 GROUP BY Table1.ID1

按我的理解,它走在括號中第一個查詢的計數值,並與其他內的計數值乘以它加入。

我已經嘗試了很多東西,但不知道該怎麼做。由於某些原因,Access會添加括號。

0

是的我有同樣的問題,當我試圖做到這一點。只需使用雙重sql函數來抵消html,你應該很好。一旦查詢已經加倍,它會像C++配額聲明一樣反應。如果失敗,你總是可以量化源字段來粘附表限制。它實際上是我希望這有助於的一塊蛋糕。