代码之家  ›  专栏  ›  技术社区  ›  squillman Johnny Fitz

不使用子查询的非重复行计数

  •  9
  • squillman Johnny Fitz  · 技术社区  · 14 年前

    假设我有一个表1有重复的行(忘记它没有主键…)是否可以在不使用联接、子查询或CTE的情况下重写下面的内容,也不必拼写出group by之类的列?

    SELECT COUNT(*)
    FROM (
        SELECT DISTINCT * FROM Table1
    ) T1
    
    4 回复  |  直到 14 年前
        1
  •  10
  •   awright18    14 年前

    你可以这样做。

    SELECT Count(DISTINCT ProductName) FROM Products
    

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

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

    如果你没有重复的记录 SELECT DISTINCT * from table 如果没有明显的区别。

        2
  •  8
  •   Peter Radocchia    14 年前

    不,不可能。

    如果您受到框架/查询工具/任何东西的限制,不能使用子查询,也不能拼出group by中的每个列名,那么您就是sol。

    如果您不受框架/查询工具/任何东西的限制,就没有理由 使用子查询。

        3
  •  3
  •   douwe Top Questions    14 年前

    如果您真的想这样做,您只需“从表1中选择count(*)按all、columns、here分组”,并将结果集的大小作为您的计数。

    但这将是一个很有价值的代码;)

        4
  •  1
  •   Jim Hobday    11 年前

    我只是想通过说您需要检查列的数据类型是否具有可比性来改进答案,否则您将在尝试使它们不同时出错:

    例如 com.microsoft.sqlserver.jdbc.sqlserverexception:无法将ntext数据类型选择为distinct,因为它不可比较。

    这对于大型二进制、XML列和其他依赖于RDBMS-RTM的列是正确的。例如,sqlserver的解决方案是从ntext到nvarchar(max),从sqlserver 2005开始。

    如果您坚持使用pk列,那么您应该是正常的(我自己还没有验证过这个问题,但我从逻辑上认为pk列必须是可比较的)