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

knp*_*wrs 12 sql postgresql subquery sql-order-by

我特别想知道PostgreSQL.鉴于以下人为的例子:

SELECT name FROM
  (SELECT name FROM people WHERE age >= 18 ORDER BY age DESC) p
LIMIT 10
Run Code Online (Sandbox Code Playgroud)

从外部查询返回的名称是否保证按内核查询的顺序排列?

Cha*_*ana 15

不,在外部查询中输入顺序:

SELECT name FROM
  (SELECT name, age FROM people WHERE age >= 18) p
ORDER BY p.age DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)

内部(子)查询返回结果集.如果你按顺序放置顺序,那么从内部(子)查询传递到外部查询的中间结果集保证按照你指定的方式排序,但是在外部查询中没有顺序,结果通过处理内部查询结果集生成的-set不保证以任何方式排序.


Erw*_*ter 7

对于简单的情况,@ Charles查询效率最高。

更一般而言,您可以使用window函数row_number()将您喜欢的任何顺序携带到主查询中,包括:

  • 为了按列没有SELECT子查询的列表,因此不可再现
  • 根据标准对等体的任意排序ORDER BY。Postgres将重用窗口功能相同的任意顺序的子查询。(但是不是真正的随机顺序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;
Run Code Online (Sandbox Code Playgroud)