内连接效果是由?

时间:2016-01-18 08:32:16

标签: postgresql

我有一个函数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

1 个答案:

答案 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} 里面这个函数。