postgresql 是否保证保留子查询中的顺序?

klsxnrf1  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(3)|浏览(167)

我特别想知道PostgreSQL。给出以下人为的例子:

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

是否保证从外部查询返回的名称与它们在内部查询中的顺序相同?

cyvaqqii

cyvaqqii1#

否,把订单按在外线查询:

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

内部(子)查询返回一个结果集。如果按此排序,则从内部(子)查询传递到外部查询的中间结果集将保证按您指定的方式排序,但如果外部查询中没有排序依据,则处理该内部查询结果集生成的结果集将不保证按任何方式排序。

trnvg8h3

trnvg8h32#

对于简单的情况,@Charles查询效率最高。
更一般地说,你可以使用窗口函数row_number()把你喜欢的 * 任何 * 订单携带到主查询中,包括:

  • 子查询的SELECT列表中的order by列 * 不是 *,因此不可重现
  • 根据ORDER BY标准对 * 对等体 * 进行任意排序。Postgres将在子查询 * 内的窗口函数中重用相同的任意顺序。(但 * 不是 * 例如random()的真正随机顺序!)

如果不想保留子查询中对等项的任意排序顺序,请改用rank()
对于复杂查询或多个查询层,这通常也上级:

SELECT p.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;
n7taea2i

n7taea2i3#

不保证的顺序相同,尽管运行时您可能会看到它通常遵循该顺序。

您应该在主查询上按

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

相关问题