Postgresql 内部连接是否按顺序生效?
我有一个函数a(),它以特定的顺序给出结果 我想做: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 您看到的任何没有的订单都是纯粹的巧
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是不允许的(有一些例外情况,但它们与此问题无关)。