不使用子查询的不同行数

时间:2010-02-19 14:24:43

标签: sql-server tsql count distinct

假设我有Table1,它有重复的行(忘记它没有主键...)是否可以在不使用JOIN,子查询或CTE的情况下重写以下内容,也无需拼写出列中的列像GROUP BY这样的东西?

SELECT COUNT(*)
FROM (
    SELECT DISTINCT * FROM Table1
) T1

4 个答案:

答案 0 :(得分:10)

你可以这样做。

SELECT Count(DISTINCT ProductName) FROM Products

但是如果你想要一个完全不同的记录计数,那么你将不得不使用你提到的其他选项之一。

如果你想做一些你在问题中建议的事情,那么这意味着你的表中有重复的记录。

如果您没有重复记录,SELECT DISTINCT * from table将没有相同的记录。

答案 1 :(得分:8)

不,这是不可能的。

如果您受到框架/查询工具/其他任何限制,无法使用子查询,并且无法拼写出GROUP BY中的每个列名,那么您就是SOL。

如果您不受框架/查询工具/其他任何限制,则没有理由使用子查询。

答案 2 :(得分:3)

如果你真的想要这样做,你可以“选择COUNT(*)FROM table1 GROUP BY all,columns,here”并将结果集的大小作为你的计数。

但它将是每天有用的代码;)

答案 3 :(得分:1)

我只是想通过说你需要检查列的数据类型是否具有可比性来改进答案 - 否则你会在尝试使它们成为DISTINCT时出错:

e.g。 com.microsoft.sqlserver.jdbc.SQLServerException:无法将ntext数据类型选为DISTINCT,因为它无法比较。

对于大型二进制,xml列和其他列,这取决于您的RDBMS - rtm。例如,SQLServer的解决方案是将它从ntext转换为从SQLServer 2005开始的nvarchar(MAX)。

如果你坚持使用PK列,那么你应该没问题(我自己没有验证过这个问题,但我从逻辑上认为PK列必须具有可比性)