2012-06-01 41 views
4

這看起來像是一個常規的事情,但我似乎無法找到如何去做。SQL - 在聯合查詢中只計算一個表的條目

我有一個連接查詢

SELECT a.nom_batim, COUNT(b.maxten) AS NumFaulty 
FROM tblTrials AS b, tblRooms AS a 
WHERE b.batiment = a.batiment 
AND b.maxten > 10 
GROUP BY a.nom_batim 
ORDER BY a.nom_batim 

應該只返回tblTrials項的計數。但是,由於我不知道如何編碼,因此它目前計數的所有發生次數爲b.maxten > 10,所有次發生次數爲b.batiment = a.batiment。表中有1個實際發生的b.maxten > 10,但是b.batiment = a.batiment有231個發生(表格設置不好,不是我的選擇;這些表被認爲是隻讀給我的),所以它返回一個計數的123.

我如何COUNT(b.maxten)正確,但仍然顯示a.nom_batim作爲batiment ID字段的用戶友好表示? (a.nom_batim是建築#batiment長的名字)

UPDATE
這是我結束了迄今爲止做..

SELECT a.nom_batim, COUNT(b.batiment) AS NumFaulty 
FROM (SELECT DISTINCT nom_batim, batiment FROM tblRooms) AS a 
INNER JOIN tblTrials AS b ON a.batiment = b.batiment 
WHERE b.maxten > 10 
GROUP BY a.nom_batim 
ORDER BY a.nom_batim 

它的工作原理,但似乎是一個資源豬時,我只需要來自tblRooms的最多30個值,但必須查詢所有5000多行,只選擇不同的batiment值。沒有batimenttblBatiment: batiment, nom_batim沒有辦法做到這一點我知道這是最好的方式,但我沒有訪問權限。

回答

0

我能做的最好到目前爲止它的工作原理:

SELECT a.nom_batim AS Building, Count(q.batiment) AS Fixes 
FROM (SELECT DISTINCT nom_batim, batiment FROM tblRooms) AS a 
INNER JOIN tblTrials AS q 
ON a.batiment = q.batiment 
WHERE q.maxten > 10 
GROUP BY a.nom_batim 

好像SELECT DISTINCT nom_batim, batiment FROM tblRooms將是緩慢的考慮tblTrials可能包含60K條目和tblRooms可能包含10,000項..但條目不輸入還所以我不能真正測試它。戈登提出了一個很好的觀點,即如果它返回相同的東西,它可能會有相同的速度。我確實有多字段主鍵,所以它可能會幫助你做一些事情(不像ID字段那麼多,但你可以做什麼)。

感謝其他人回答。

1

可以執行在一個子查詢的數量,使得它僅適用於一個表中的記錄:

SELECT .. 
FROM (SELECT batiment, COUNT(maxten) FROM tblTrials WHERE maxten > 10) AS b 
    ,tblRooms AS a 
... 

否則,計數所有記錄在最終結果中應用,因爲查詢引擎沒有按不區分來自COUNT中某個地方或另一個地方的記錄。

+0

我剛剛發佈後發現(似乎發生),但想到也許額外的查詢會降低性能。似乎沒有另一種簡單的方法,雖然.. – StuckAtWork

+0

它不應該太低效。所有的記錄將被分組並計算一次,然後合併一次以獲得結果。如果您想確定,可以查看查詢計劃。 – mellamokb

+0

原來你不能這樣做......它期望'batiment'作爲對用戶不友好的聚合函數的一部分。我需要使用FROM(SELECT ...)填充nom_batim,而不是將FROM(SELECT ...)放在tblTrials上。不知道爲什麼,但它的工作。 – StuckAtWork

0

嘗試使用:

HAVING b.maxten>10 
0

試試這個:

SELECT a.nom_batim, COUNT(b.maxten) AS NumFaulty 
FROM tblTrials AS b, tblRooms AS a 
WHERE b.batiment = a.batiment 
GROUP BY a.nom_batim 
HAVING count(b.maxten) > 10 
ORDER BY a.nom_batim 
+0

我不相信這是正確的..導致錯誤。因爲我不能聚合b.maxten(因爲count會產生maxten的列表,並且總是爲1),這是行不通的。 – StuckAtWork

+0

對不起,錯過了它! –

+0

現在它只返回超過10個maxten條目的建築物。 = P Maxten是我正在做的簡單試用條件的簡單名稱;這意味着數字字段'maxten'的值應該小於11,而不是建築物需要少於10個該字段的條目。對困惑感到抱歉。 – StuckAtWork

1

再回到原來的查詢,你可以得到你想要的東西,如果你對tblTrials表標識列:

SELECT a.nom_batim, COUNT(distinct b.id) AS NumFaulty 
FROM tblTrials b INNER JOIN tblRooms a 
    ON b.batiment = a.batiment 
WHERE b.maxten > 10 
GROUP BY a.nom_batim 
ORDER BY a.nom_batim 

我還用正確的連接語法(使用「連接」關鍵字)替換了您的連接語法。

+0

我沒有一個合適的索引,它是3個字段的組合。有沒有辦法COUNT(不同的b.fieldA,b.fieldB,b.fieldC)?再次,數據庫設計不是我的錯,我只需要編寫它。 – StuckAtWork

+0

您可以將這些字段連接在一起並計數,如count(distinct fieldA +';'+ fieldB +';'+ fieldC)。這是SQL Server語法,我不知道在Access中如何連接字符串。此外,您可能必須使用cast()函數將非字符數據類型轉換爲字符。 –

+0

這可能有效,但效率會更高還是更低? – StuckAtWork