为什么以下两个查询返回相同的结果?
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score ASC)
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score DESC)
考虑到我手动指定子查询的顺序,这很令人困惑。
为什么以下两个查询返回相同的结果?
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score ASC)
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score DESC)
考虑到我手动指定子查询的顺序,这很令人困惑。
子查询中结果的顺序是无关紧要的,除非您在子查询中使用 TOP,而您在这里没有这样做。大多数 SQL 变体不允许这种语法——例如,在子查询中使用 ORDER BY 会在 SQL Server 中引发错误。
您的顶级查询没有 ORDER BY,因此 FIRST 或 TOP 1 的概念在该查询的上下文中未定义。
在参考文档中,微软声明(强调我的):
因为记录通常不按特定顺序返回(除非查询包含 ORDER BY 子句),所以这些函数返回的记录将是任意的。
直接回答问题:
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
s 和游戏的 s ,你可以像这样得到最好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
您的陈述是和的完美功能等价物。
如果您真的想检索第一个和最后一个分数,您将需要一个 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