First()函数使用什么顺序?

时间:2012-11-30 18:59:37

标签: sql ms-access ms-access-2007

为什么以下两个查询会返回相同的结果?

SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score ASC)
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score DESC)

考虑到我手动指定子查询的顺序,这很令人困惑。

3 个答案:

答案 0 :(得分:2)

子查询中结果的顺序是无关紧要的,除非您在子查询中使用TOP,而不是在此处。大多数SQL变体都不允许这种语法 - 例如,在子查询中使用ORDER BY会在SQL Server中引发错误。

您的顶级查询没有ORDER BY,因此在 查询的上下文中未定义FIRST或TOP 1的概念。

reference docs中,微软表示(强调我的):

  

因为记录通常不按特定顺序返回(除非   查询包括ORDER BY子句),这些记录返回的记录   函数将任意

答案 1 :(得分:2)

直接回答问题:

在大多数子查询中,Access忽略ORDER BY子句。我相信(但无法证明)这是由于查询优化器中的错误/局限性造成的,尽管没有在任何地方(我能找到)进行记录。我已经使用Access 2007和Access 2016测试了很多SQL来得出这个结论。

要使示例按预期工作:

TOP 100 PERCENT添加到子查询:

SELECT FIRST(score) FROM (SELECT TOP 100 PERCENT score FROM scores ORDER BY score ASC)
SELECT FIRST(score) FROM (SELECT TOP 100 PERCENT score FROM scores ORDER BY score DESC)

何时使用First / Last代替Max / Min

当您想使用此方法而不是更简单的MinMax聚合函数的一个很好的例子是,当您希望从同一记录中获得另一个字段时,例如,如果基础scores表还容纳了name个玩家和游戏中的round个,您可以获得最佳和最差玩家的namescore在每个round中都是这样的:

SELECT
  round, FIRST(name) AS best, FIRST(score) AS highscore, LAST(name) AS worst, LAST(score) AS lowscore
FROM
  (SELECT TOP 100 PERCENT * FROM scores ORDER BY score DESC)
GROUP BY
  round

答案 2 :(得分:-2)

您的陈述是完美的功能等价物
SELECT Min(Score) FROM Scores
SELECT Max(Score) FROM Scores
如果您确实想要检索第一个和最后一个分数,则需要一个AutoNumber或DateTime字段来指示输入顺序。然后,您可以查询:

SELECT First(Score), Last(Score) FROM Scores ORDER BY MySortKey

如果你坚持你的问题,正确的语法将是
SELECT FIRST(score) FROM (SELECT score FROM scores) ORDER BY score ASC
或者,简化,
SELECT FIRST(score) FROM scores ORDER BY score ASC