15

特にPostgreSQLについて疑問に思っています。次の不自然な例を考えてみます。

SELECT name FROM
  (SELECT name FROM people WHERE age >= 18 ORDER BY age DESC) p
LIMIT 10

外側のクエリから返された名前は、内側のクエリの順序であることが保証されていますか?

4

3 に答える 3

18

いいえ、order by を外側のクエリに入れます。

SELECT name FROM
  (SELECT name, age FROM people WHERE age >= 18) p
ORDER BY p.age DESC
LIMIT 10

内部 (サブ) クエリは結果セットを返します。そこに注文を入れると、内部(サブ)クエリから外部クエリに渡される中間結果セットは、指定した方法で順序付けられることが保証されますが、外部クエリでの注文なしでは、結果内部クエリの結果セットを処理して生成されたセットは、どのような方法でもソートされることが保証されていません。

于 2013-04-27T05:51:16.427 に答える
10

単純なケースでは、@Charles クエリが最も効率的です。

より一般的には、ウィンドウ関数row_number()を使用して、次のような任意の順序でメイン クエリを実行できます。

  • サブクエリのリストにないため、再現できない列による順序SELECT
  • 基準に従ったピアの任意の順序。Postgres は、サブクエリORDER BYのウィンドウ関数で同じ任意の順序を再利用します。(ただし、たとえば、真にランダムな順序ではありません!) サブクエリからのピアの任意の並べ替え順序を保持したくない場合は、代わりに使用します。random()
    rank()

これは、複雑なクエリや複数のクエリ レイヤーで一般的に優れている場合もあります。

SELECT name
FROM  (
   SELECT name, row_number OVER (ORDER BY <same order by criteria>) AS rn
   FROM   people
   WHERE  age >= 18
   ORDER  BY <any order by criteria>
   ) p
ORDER  BY p.rn
LIMIT  10;
于 2013-04-28T18:14:19.613 に答える
-2

同じ順序であるとは限りませんが、実行すると、一般的に順序に従っていることがわかります。

メインクエリで注文する必要があります

SELECT name FROM
(SELECT name FROM people WHERE age >= 18) p
ORDER BY p.age DESC LIMIT 10
于 2013-04-27T05:54:41.017 に答える