2013-08-24 169 views
0

我有SQL表hr_RegistrantCategories這樣的:SQL沒有返回正確的計數

RegistrantID CategoryID 
1 47 
4 276 
4 275 
4 278 
4 274 
4 277 
16276 276 
16276 275 
16276 278 
16295 276 
16295 275 
16295 278 
16295 274 
16295 277 
16292 276 
16292 275 
16292 278 
16292 274 
16292 277 
16293 276 
16293 275 
16293 278 
16293 274 
16293 277 
16294 276 
16294 275 
16294 278 
16294 274 
16294 277 
16303 276 
16303 275 
16303 278 
16303 274 
16303 277 
16302 276 
16302 275 
16302 278 
16302 274 
16302 277 
16303 276 
16303 275 
16303 278 
16303 274 
16303 277 
16304 276 
16304 275 
16304 278 
16304 274 
16304 277 
26 276 
26 275 
26 278 
26 274 
26 277 
16305 276 
16305 275 
16305 278 
16305 274 
16305 277 
29 276 
29 275 
29 278 
29 274 
29 277 
16306 276 
16306 275 
16306 278 
16306 274 
16306 277 
16306 276 
16306 275 
16306 278 
16306 274 
16306 277 
16307 276 
16307 275 
16307 278 
16307 274 
16307 277 
16307 276 
16307 275 
16307 278 
16307 274 
16307 277 

和另一個表hr_categories這樣的:

CategoryID 
1 
2 
3 
4 
5 
6 
... 
.. 
.. 
700 

但是當我使用下面的它在結果返回相同的計數查詢

SELECT COUNT(RC.RegistrantID) 
      FROM dbo.hr_Registrants R INNER JOIN dbo.hr_RegistrantCategories RC ON R.RegistrantID = RC.RegistrantID 
      WHERE R.Deleted = 0 
      AND RC.CategoryID IN (SELECT CategoryID FROM dbo.hr_Categories) 


      SELECT C.CategoryID, 
      (
      SELECT COUNT(DISTINCT RC.RegistrantID) 
      FROM dbo.hr_Registrants R INNER JOIN dbo.hr_RegistrantCategories RC ON R.RegistrantID = RC.RegistrantID 
      WHERE R.Deleted = 0 
      AND RC.CategoryID IN (SELECT CategoryID FROM dbo.hr_Categories C1 WHERE C1.Deleted = 0) 


     )AS RegistrantsCount 
     FROM dbo.hr_Categories C 

結果是:

CategoryID RegistrantsCount 
1 13 
2 13 
3 13 
4 13 
5 13 
6 13 
7 13 
8 13 
+0

不要緊,它在做什麼......你想要做什麼? – Bohemian

+0

通過hr_categories表的分類標識的組註冊人表 – DotnetSparrow

回答

1

內部查詢與外部查詢不相關,所以它爲每一行返回相同的值。

SELECT C.CategoryID, 
     (
     SELECT COUNT(DISTINCT RC.RegistrantID) 
     FROM dbo.hr_Registrants R INNER JOIN dbo.hr_RegistrantCategories RC ON R.RegistrantID = RC.RegistrantID 
     WHERE R.Deleted = 0 
     AND RC.CategoryID IN (SELECT CategoryID FROM dbo.hr_Categories C1 WHERE C1.Deleted = 0) 

     AND RC.CategoryID = C.CategoryID -- correlate with the outer query 

)AS RegistrantsCount 
    FROM dbo.hr_Categories C 
+0

你能解釋這個答案有什麼問題嗎?我真的想知道爲了修復(或刪除)它 – bwt

+0

我沒有投票,但我猜測它是因爲所有的子查詢都可以被認爲是次優的,當一個組可能更好。 –

+0

感謝@BobVale。但是,我認爲優化查詢的唯一方法是在真實數據上進行分析並查看執行計劃。例如,查看查詢優化器將子查詢轉換爲哈希匹配的頻率令人驚訝 – bwt

1

我認爲這個查詢是做你想做的。我正在使用LEFT JOIN,因爲我想你也想知道計數是否爲0?如果沒有,你可以使它成爲INNER JOIN

SELECT C.CategoryID, COUNT(RC.RegistrantID) AS RegistrantsCount 
    FROM dbo.hr_categories C 
    LEFT JOIN dbo.RegistrantCategories RC 
     ON RC.CategoryID = C.CategoryID 
    LEFT JOIN dbo.hr_Registrants R 
     ON R.RegistrantID = RC.RegistrantID 
     AND R.Deleted = 0 
    WHERE C.Deleted = 0 
    GROUP BY C.CategoryID