SQL计数(*)和不同
为什么我们不能在SQL中使用SQL计数(*)和不同,sql,Sql,为什么我们不能在SQL中使用count(distinct*)?就像在计算所有不同的行一样?您确实可以 但是,如果您有一个标识符,则不会有任何完全不同的行。但你可以这样做,例如: SELECT COUNT(DISTINCT SenderID) FROM Messages 您可以选择表中的所有列并按…分组 SELECT column1, column2, column3, count(*) FROM someTable GROUP BY column1, column2, column3 为什么
count(distinct*)
?就像在计算所有不同的行一样?您确实可以
但是,如果您有一个标识符,则不会有任何完全不同的行。但你可以这样做,例如:
SELECT COUNT(DISTINCT SenderID) FROM Messages
您可以选择表中的所有列并按…分组
SELECT column1, column2, column3, count(*)
FROM someTable
GROUP BY column1, column2, column3
为什么不呢
select
count(distinct name)
from
people
尽管我强烈建议您重新考虑使用的任何查询。在大多数情况下,按
分组更合适(更快)
编辑:阅读了问题注释后,我应该指出,您应该永远不要要求DBMS做比实际需要做的更多的工作来获得结果。如果您事先知道表中不会有任何重复的行,则不要使用DISTINCT
UberKludge,并且可能是postgre特定的,但是
select count( distinct table::text ) from table
您可以在SQLServer2005中尝试CTE
;WITH cte AS (
SELECT DISTINCT Val1,Val2, Val3
FROM @Table
)
SELECT COUNT(1)
FROM cte
要回答此问题,请参阅文档
指定所有行都应为
计数以返回的总数
表中的行。COUNT()不接受
参数,不能与一起使用
不同的COUNT()不需要
表达式参数,因为
定义,它不使用
任何特定的信息
专栏。COUNT(*)返回的是
指定表中的行没有
消除重复。这很重要
每一行都是分开的。这包括
包含空值的行
COUNT(*)是与查询匹配的行数
行包含唯一的信息,例如rowid。根据定义,所有行都是不同的
您必须在某些字段中计算值的不同实例。某些语言可能无法处理“distinct*”,因此,如果您希望通过许多列进行区分,您可能希望使用“distinct ColumnA | ColumnB”,在判断值是否不同之前,将这些值组合在一起。请注意您的变量是否为数字,您的数据库处理程序是否可以对字符串进行自动类型转换。您所说的“不同行”是什么意思?您是否有在整行中重复的行,这就是您要查找的吗?现在当我想到它时,因为我们的表是标准化的,所以我们不会有完全相同的行,所以它是无用的,对吗??这就是原因吗???@Myth17如果在主键存在的级别上进行规范化,那么在这种情况下,所有行都将是不同的。因为两个poe可能具有相同的名称。OP询问了COUNT(DISTINCT*)。对不起,我回答时,这是问题中的另一个文本。为什么一行包含唯一信息?它不必。。。也许应该这样做,但不是必须的。@CHristian-hi,以前从未见过这样做。出于好奇,我用一个现有的表运行了它,我发现“附近的语法不正确”)。是否在ms sql server中工作?注意-括号内的“我的选择”运行完美Oracle DISTINCT和GROUP BY具有相同的执行计划,因为DISTINCT是使用GROUP BY实现的。所以应该没有区别。@Kamal:对不起,忘记了SQL Server在嵌套查询方面有点不确定。将别名添加到末尾(as T
)解决了这个问题。@mrshinny:这是关于请求最少的工作量。从概念上讲,groupby
要求的工作量比DISTINCT
要少,因此有时(并非总是)会产生更有效的计划。另请参见JOIN
和EXISTS
之间的区别。我只是将MyTable中的select Count(distinct列)用作T,效果很好。这也不是一个完整的证明方法。例如,('test','string')和('tes','t string')看起来是一样的。你可以用填充字符串来做一些事情,但它会变得一团糟。更好的做法是只使用带有DISTINCT的子查询,然后从中获得一个计数。当您说“来自文档”时,会是哪个文档?Sql Server帮助文档。但这实际上并没有得到问题的答案,这并没有回答问题
select count (Tag_no) from tab_raw_tag_value where tag_no in (select distinct tag_no from tab_raw_tag_value)
select count (Tag_no) from tab_raw_tag_value where tag_no in (select distinct tag_no from tab_raw_tag_value)