5

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

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

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

4

3 回答 3

3

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

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

参考文档中,微软声明(强调我的):

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

于 2012-11-30T20:01:57.077 回答
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包含玩家的rounds 和游戏的 s ,你可以像这样得到最好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
于 2018-09-17T13:57:39.697 回答
-2

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

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

于 2012-11-30T20:54:04.210 回答