次の2つのクエリが同じ結果を返すのはなぜですか?
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score ASC)
SELECT FIRST(score) FROM (SELECT score FROM scores ORDER BY score DESC)
サブクエリの順序を手動で指定することを考えると、混乱を招きます。
次の2つのクエリが同じ結果を返すのはなぜですか?
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を使用すると、SQLServerでエラーがスローされます。
トップレベルのクエリにはORDERBYがないため、FIRSTまたはTOP 1の概念は、そのクエリのコンテキストでは定義されていません。
リファレンスドキュメントでは、Microsoftは次のように述べています(私の強調):
レコードは通常特定の順序で返されないため(クエリにORDER BY句が含まれていない限り)、これらの関数によって返されるレコードは任意です。
質問に直接答えるには:
ORDER BY
Accessは、ほとんどのサブクエリで句を無視します。私はこれを信じています(しかし証明することはできません)が、クエリオプティマイザーのバグ/制限が原因ですが、どこにも文書化されていません(私が見つけることができました)。この結論に達するために、Access2007とAccess2016を使用して多くの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