原因 - 如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中

时间:2013-09-03 05:12:55

标签: sql sql-server

我知道下面的查询会导致错误 - 如果指定了SELECT DISTINCT,ORDER BY项必须出现在选择列表中。

SELECT DISTINCT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'
ORDER BY birthdate;

这是什么原因?究竟发生了什么?如果我不使用DISTINCT或仅在SELECT或ORDER BY city中添加birthdate,它会给我一些输出,但不是错误。是因为SELECT DISTINCT city只给出了一个带有城市的结果集吗?

编辑 - (我认为这可能是我的问题的答案)

SELECT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'

考虑以上查询。不确定,但我认为这是它的工作原理 - 在幕后,SQL Server可能有一个包含所有列的结果集,但我们只显示了我将称之为“显示集”的城市列。因此,按城市或任何其他列排序是有效的。

当我们使用SELECT DISTINCT城市时,结果集会发生什么? SQL服务器在其结果集中不仅包含具有DISTINCT城市的行。它具有整个结果集,就像SELECT *查询生成的结果集一样。但是,它只显示基于城市的不同行。现在可以根据出生日期对显示的集合进行排序吗?否。

在一个拥有许多员工的城市,即许多生日,SQL服务器无法分辨应该使用哪个生日来订购显示的集合。这就是它显示错误消息的原因。

2 个答案:

答案 0 :(得分:17)

可以使用SELECT DISTINCT重写GROUP BY的查询。所以查询:

SELECT DISTINCT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA' ;

相当于:

SELECT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'
GROUP BY city ;

你也不能在这里使用ORDER BY birthdate。两个查询的原因相同。可能有许多(多个)行具有相同的city但不同的birthdate。哪一个应该用于订购(如果允许的话?)

但是,您可以将聚合函数与GROUP BY查询一起使用:

SELECT city
FROM HR.Employees
WHERE country = N'USA' AND region = N'WA'
GROUP BY city 
ORDER BY MIN(birthdate) ;               -- or MAX(birthdate)

答案 1 :(得分:1)

try this: 
select city 
    from (
    SELECT city, min(birthdate) as birthdate
    FROM HR.Employees
    WHERE country = N'USA' AND region = N'WA'
    group by city
          ) as t
    order by birthdate