为什么以下两个查询会返回相同的结果?
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score ASC)
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score DESC)
考虑到我手动指定子查询的顺序,这很令人困惑。
答案 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
:
当您想使用此方法而不是更简单的Min
和Max
聚合函数的一个很好的例子是,当您希望从同一记录中获得另一个字段时,例如,如果基础scores
表还容纳了name
个玩家和游戏中的round
个,您可以获得最佳和最差玩家的name
和score
在每个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