我知道以下查询会导致错误-如果指定了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 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无法确定应使用哪个生日来订购显示的集合。这就是为什么它显示错误消息的原因。
SELECT DISTINCT可以使用重写查询GROUP BY。所以查询:
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。应该使用哪一个进行订购(如果允许的话?)
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)