5

次の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)

サブクエリの順序を手動で指定することを考えると、混乱を招きます。

4

3 に答える 3

3

サブクエリ内でTOPを使用しない限り、サブクエリ内の結果の順序は関係ありません。ここでは使用しません。ほとんどのSQLバリアントは、この構文を許可しません。たとえば、サブクエリでORDER BYを使用すると、SQLServerでエラーがスローされます。

トップレベルのクエリにはORDERBYがないため、FIRSTまたはTOP 1の概念は、そのクエリのコンテキストでは定義されていません。

リファレンスドキュメントでは、Microsoftは次のように述べています(私の強調):

レコードは通常特定の順序で返されないため(クエリにORDER BY句が含まれていない限り)、これらの関数によって返されるレコードは任意です。

于 2012-11-30T20:01:57.077 に答える
2

質問に直接答えるには:

ORDER BYAccessは、ほとんどのサブクエリで句を無視します。私はこれを信じています(しかし証明することはできません)が、クエリオプティマイザーのバグ/制限が原因ですが、どこにも文書化されていません(私が見つけることができました)。この結論に達するために、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にプレーヤーのroundsとゲームのsが含まれている場合などです。 、あなたはこのようにそれぞれの最高と最悪のプレーヤーのnameとを得ることができます:scoreround

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 に答える