我特别想知道PostgreSQL。给出以下人为的例子:
SELECT name FROM (SELECT name FROM people WHERE age >= 18 ORDER BY age DESC) p LIMIT 10
是否保证从外部查询返回的名称与它们在内部查询中的顺序相同?
cyvaqqii1#
否,把订单按在外线查询:
SELECT name FROM (SELECT name, age FROM people WHERE age >= 18) p ORDER BY p.age DESC LIMIT 10
内部(子)查询返回一个结果集。如果按此排序,则从内部(子)查询传递到外部查询的中间结果集将保证按您指定的方式排序,但如果外部查询中没有排序依据,则处理该内部查询结果集生成的结果集将不保证按任何方式排序。
trnvg8h32#
对于简单的情况,@Charles查询效率最高。更一般地说,你可以使用窗口函数row_number()把你喜欢的 * 任何 * 订单携带到主查询中,包括:
row_number()
SELECT
ORDER BY
random()
如果不想保留子查询中对等项的任意排序顺序,请改用rank()。对于复杂查询或多个查询层,这通常也上级:
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;
n7taea2i3#
不保证的顺序相同,尽管运行时您可能会看到它通常遵循该顺序。
您应该在主查询上按
SELECT name FROM (SELECT name FROM people WHERE age >= 18) p ORDER BY p.age DESC LIMIT 10
3条答案
按热度按时间cyvaqqii1#
否,把订单按在外线查询:
内部(子)查询返回一个结果集。如果按此排序,则从内部(子)查询传递到外部查询的中间结果集将保证按您指定的方式排序,但如果外部查询中没有排序依据,则处理该内部查询结果集生成的结果集将不保证按任何方式排序。
trnvg8h32#
对于简单的情况,@Charles查询效率最高。
更一般地说,你可以使用窗口函数
row_number()
把你喜欢的 * 任何 * 订单携带到主查询中,包括:SELECT
列表中的order by列 * 不是 *,因此不可重现ORDER BY
标准对 * 对等体 * 进行任意排序。Postgres将在子查询 * 内的窗口函数中重用相同的任意顺序。(但 * 不是 * 例如random()
的真正随机顺序!)如果不想保留子查询中对等项的任意排序顺序,请改用
rank()
。对于复杂查询或多个查询层,这通常也上级:
n7taea2i3#
不保证的顺序相同,尽管运行时您可能会看到它通常遵循该顺序。
您应该在主查询上按