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

时间:2013-04-27 05:48:30

标签: sql postgresql subquery sql-order-by

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

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

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

3 个答案:

答案 0 :(得分:13)

不,将订单放在外部查询中:

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

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

答案 1 :(得分:6)

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

更一般地说,您可以使用窗口函数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;

答案 2 :(得分:0)

无法保证处于相同的顺序,但是当您运行它时,您可能会发现它通常遵循订单。

您应该在主查询

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