6

我知道下面的查询会导致错误 - 如果指定了 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 中添加生日,它会给我一些输出,但不会出错。是因为SELECT DISTINCT city只给出了城市的结果集而没有别的吗?

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

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

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

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

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

4

2 回答 2

25

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)
于 2013-09-03T05:53:42.117 回答
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
于 2013-09-03T06:14:09.917 回答