小编典典

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

sql

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

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

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

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

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

在一个有许多雇员(即许多生日)的城市中,SQL Server无法确定应使用哪个生日来订购显示的集合。这就是为什么它显示错误消息的原因。


阅读 261

收藏
2021-03-23

共1个答案

小编典典

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 BYbirthdate在这里使用。两个查询的原因相同。可能有许多(不止一个)相同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)
2021-03-23