2013-05-08 125 views
3

我有这个疑问,从一张桌子和行数的查询会返回取行:查询选择COUNT(*)和列

SELECT tab.*, 
     (SELECT Count(*) 
     FROM mytable mtb 
     WHERE mtb.name = 'XYZ' 
       AND mtb.TYPE = 'TP') 
FROM mytable tab 
WHERE tab.name = 'XYZ' 
     AND tab.TYPE = 'TP' 

现在,如果你看到了,我只是想主查询返回所有其他列的行数。我需要在非常大的查询中将此查询用作子查询。现在我想知道是否有更好的方法来写这个查询。我的意思是我们重复查询只是为了分开计数。所以,可以请你提供更优化的形式

回答

7

您应该使用解析函数count()

select tab.*, count(*) over() as totalcnt 
from mytable tab 
where tab.name = 'XYZ' and tab.type = 'TP' 
+0

是不是COUNT(*)OVER()一样普通COUNT(*)? – kyooryu 2013-05-08 13:20:15

+3

@kyooryu:不,它不是。带有附加列的“普通”计数需要在这些列上有一个“GROUP BY”。 – 2013-05-08 13:22:04

+0

实际上,经过一些测试后,我发现我真正需要的是'count(*)over(按名称分区,类型)'!非常感谢帮助我学习新的命令:) – MozenRath 2013-05-09 09:33:43