特にPostgreSQLについて疑問に思っています。次の不自然な例を考えてみます。
SELECT name FROM
(SELECT name FROM people WHERE age >= 18 ORDER BY age DESC) p
LIMIT 10
外側のクエリから返された名前は、内側のクエリの順序であることが保証されていますか?
特にPostgreSQLについて疑問に思っています。次の不自然な例を考えてみます。
SELECT name FROM
(SELECT name FROM people WHERE age >= 18 ORDER BY age DESC) p
LIMIT 10
外側のクエリから返された名前は、内側のクエリの順序であることが保証されていますか?
いいえ、order by を外側のクエリに入れます。
SELECT name FROM
(SELECT name, age FROM people WHERE age >= 18) p
ORDER BY p.age DESC
LIMIT 10
内部 (サブ) クエリは結果セットを返します。そこに注文を入れると、内部(サブ)クエリから外部クエリに渡される中間結果セットは、指定した方法で順序付けられることが保証されますが、外部クエリでの注文なしでは、結果内部クエリの結果セットを処理して生成されたセットは、どのような方法でもソートされることが保証されていません。
単純なケースでは、@Charles クエリが最も効率的です。
より一般的には、ウィンドウ関数row_number()
を使用して、次のような任意の順序でメイン クエリを実行できます。
SELECT
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;
同じ順序であるとは限りませんが、実行すると、一般的に順序に従っていることがわかります。
メインクエリで注文する必要があります
SELECT name FROM
(SELECT name FROM people WHERE age >= 18) p
ORDER BY p.age DESC LIMIT 10