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

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

于 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 回答