Postgresql 内部连接是否按顺序生效?

Postgresql 内部连接是否按顺序生效?,postgresql,Postgresql,我有一个函数a(),它以特定的顺序给出结果 我想做: select final.*,tablex.name from a() as final inner join tablex on (a.key=tablex.key2) 我的问题是,我能保证连接不会影响a()集的行顺序吗 a()是: select .... from.... joins... order by x,y,z 简短版本: SQL查询返回的行的顺序在任何方面都不能保证,除非使用orderby 您看到的任何没有的订单都是纯粹的巧

我有一个函数a(),它以特定的顺序给出结果

我想做:

select final.*,tablex.name
from a() as final
inner join tablex on (a.key=tablex.key2)
我的问题是,我能保证连接不会影响a()集的行顺序吗

a()
是:

select ....
from....
joins...
order by x,y,z
简短版本:

SQL查询返回的行的顺序在任何方面都不能保证,除非使用
orderby

您看到的任何没有的订单都是纯粹的巧合,可以不依赖


那么到目前为止,我是如何始终得到正确的订单的呢?当我从a()中选择*时

如果您的函数是SQL函数,那么函数中的查询将按“原样”执行(基本上是“内联的”),因此您只运行一个具有order by的查询。如果它是一个PL/pgSQL函数,并且它只执行一个
返回查询…
,那么您也只能执行一个查询,该查询具有一个
order by

假设您确实使用SQL函数,然后运行:

select final.*,tablex.name
from a() as final
   join tablex on a.key=tablex.key2
相当于:

select final.*,tablex.name
from (
  -- this is your query inside the function
  select ...
  from ...
   join ...
  order by x,y,z
)  as final
   join tablex on a.key=tablex.key2;
在这种情况下,派生表中的
orderby
没有意义,因为它可能被整体
orderby
语句“推翻”。事实上,一些数据库会完全拒绝这个查询(有时我希望Postgres也会这样做)


在**总体*查询中,如果没有order by,数据库可以自由选择所需的任何行顺序

回到最初的问题:

我可以保证连接不会影响()设置时的行顺序吗

答案是明确的:否-该查询的行顺序无法保证。如果您需要可以依赖的订单,您可以通过指定
订单


我甚至会从函数中删除
orderby
——如果有人运行:
select*from()orderby z,y,x
——我认为Postgres不会聪明到删除函数中的
orderby

如果没有
订购人,则无法保证任何订单。获得保证的排序顺序的唯一(实际上:唯一)方法是
orderby
——即使没有连接,orderby也是在a()中实现的,我的问题是,使用a()结果进行的内部连接是否会导致不同的顺序
select*from a()
不保证任何顺序(即使在函数中有order by时也是如此)。您必须在最终选择中指定一个
order by
。同样,没有order(order table/subquery/etc)这类东西SQL中的本质。如果没有显式的
ORDER BY
,在最外部的查询中,结果顺序无法得到保证,请考虑在多线程处理数据时并行执行。简单的回答是:不。但这也没关系,因为这里已经提到,要获得有序的结果,必须应用ORDER BY子句。您甚至可能会发现子查询中的order by是不允许的(有一些例外情况,但它们与此问题无关)。