2013-08-24 121 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