【问题标题】:how to use DISTINCT when I have multiple column in sql server当我在 sql server 中有多个列时如何使用 DISTINCT
【发布时间】:2012-04-21 09:50:54
【问题描述】:

我有以下疑问:

select carBrand, carYear, carModel from cars;

我想要的是只获得不同的车名。

我写了这个,但这不是我想要的。

select DISTINCT carBrand, carYear, carModel from Cars;

我该如何解决这个问题?

【问题讨论】:

  • 在我的 SqlServer 中,“从 Cars 中选择 DISTINCT carBrand、carYear、carModel;”完美运行
  • 个人认为OUTER APPLYthis 这样使用会更好

标签: sql sql-server distinct


【解决方案1】:

试试

SELECT carBrand , carYear ,carModel 
FROM Cars 
GROUP BY carBrand , carYear ,carModel;

【讨论】:

    【解决方案2】:

    DISTINCT 适用于整行,而不是特定列。如果要获取唯一名称,请仅选择该列。

    SELECT DISTINCT carBrand FROM Cars
    

    【讨论】:

      【解决方案3】:

      我不确定为什么接受的答案已被接受,当然也不明白为什么它被投票,但 OP 在问题中有以下内容:

      我写了这个,但这不是我想要的。

      select DISTINCT carBrand, carYear, carModel from Cars;
      

      接受的答案建议使用:

      SELECT carBrand , carYear ,carModel 
      FROM Cars 
      GROUP BY carBrand , carYear ,carModel;
      

      返回与 OP 查询完全相同的结果。实际上,甚至不鼓励将答案中的建议(使用 group by)用于获得不同的结果,而应将其用于聚合。有关更多信息,请参阅this 答案。

      此外,SQL Server 足够聪明,可以理解如果查询中没有聚合函数,那么查询实际上是在请求distinct,因此它会在后台使用distinct

      正如@MarkByers 在他的回答中指出的那样,Distinct 将对整行执行不同的操作。

      对于那些想要测试上述内容的人,这里有一个脚本,它将创建一个包含 3 列的表,然后用数据填充它。两者(distinctgroup by)都将返回相同的结果集。

      CREATE TABLE [dbo].[Cars](
          [carBrand] [varchar](50) NULL,
          [carYear] [int] NULL,
          [carModel] [varchar](50) NULL
      )
      go;
      insert into Cars values('BMW', 2000, '328 i');
      insert into Cars values('BMW', 2000, '328 i');
      insert into Cars values('BMW', 2000, '328 i');
      insert into Cars values('BMW', 2000, '3M');
      

      两个查询都会返回这个结果:

      carBrand    carYear    carModel
      BMW         2000       328 i
      BMW         2000       3M
      

      结论

      如果您想要不同的记录,请勿使用group by。使用distinct。使用SUMCOUNT等聚合函数时使用group by

      【讨论】:

        【解决方案4】:

        这取决于你想要什么。例如,如果您想要“Toyota Corolla”和“Toyota Camry”,但忽略年份,那么您可以这样做:

        SELECT DISTINCT carBrand + ' ' + carModel AS carName
        FROM Cars;
        

        【讨论】:

        • 不要试图吹毛求疵或成为一个混蛋,因为 SQL 不是我花费几乎那么多时间的东西,但我当然总是觉得在单个列上只获得 DISTINCT 非常简单,但是我偶然发现了这个页面,因为我只从 SELECT distinct id from tablename 获得了 20 条记录,而从 SELECT distinct id, pid from tablename 获得了 1000 条记录
        • SELECT distinct id, pid from table == select distinct(id,pid) from table 不同的关键字作为所有列名的组合。它有包含所有列的秘密括号。可能会让人们感到困惑
        猜你喜欢
        • 2015-04-11
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2021-11-13
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        相关资源
        最近更新 更多