我有一个函数a(),它以特定的顺序给出结果。
我想这样做:
select final.*,tablex.name
from a() as final
inner join tablex on (a.key=tablex.key2)
我的问题是,我可以保证连接不会影响行的顺序作为()设置吗?
a()
是:
select ....
from....
joins...
order by x,y,z
答案 0 :(得分:1)
简短版本:
无法以任何方式保证SQL查询返回的行的顺序 ,除非 您使用order by
您在没有order by
的情况下看到的任何订单都是纯粹的巧合,可以不。
那么我到目前为止总是得到正确的订单呢?当我做
时Select * from a()
如果你的函数是 SQL 函数,那么函数内部的查询就会被执行"就像#34; (它基本上是"内联")所以你只运行一个 有一个订单的查询。如果它是PL / pgSQL函数并且它唯一做的是RETURN QUERY ...
那么你再次只有一个单查询被执行,它有一个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;
在这种情况下,派生表中的order by
没有意义,因为它可能会被推翻"通过整体order by
声明。事实上,有些数据库会完全拒绝这个查询(我有时希望Postgres也这样做)。
在**整体*查询中没有order by
,数据库可以自由选择它想要的任何行顺序。
回到最初的问题:
我可以保证连接不会影响行的顺序()设置它吗?
答案是明确的:否 - 该查询的行顺序无法保证。如果您需要您可以信赖的订单,则 指定order by
。
我甚至会去除功能中的order by
- 如果有人跑了怎么办:select * from a() order by z,y,x
- 我不认为Postgres会足够智能删除{{1} 里面这个函数。