我特别想知道 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
内部(子)查询返回结果集。如果您将 order by 放在那里,则从内部(子)查询传递到外部查询的中间结果集保证按照您指定的方式排序,但在外部查询中没有 order by,结果通过处理该内部查询结果集生成的 -set 不保证以任何方式排序。
对于简单的情况,@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