postgresql - 为什么我在加入横向功能时不能参考表格?
问题描述
我有疑问:
select *
from dates d
left join (select * from range( d.start, d.stop ) ) x
on d.start < d.stop
导致错误的原因:
ERROR: invalid reference to FROM-clause entry for table "d"
LINE 3: left join (select * from range( d.start, d.stop ) ) x on d.s...
^
HINT: There is an entry for table "d", but it cannot be referenced from this part of the query.
阅读文档:
FROM 中出现的表函数也可以在关键字 LATERAL 之前,但对于函数,关键字是可选的;在任何情况下,函数的参数都可以包含对前面 FROM 项提供的列的引用。
LATERAL 项可以出现在 FROM 列表的顶层,或者出现在 JOIN 树中。在后一种情况下,它还可以引用位于右侧的 JOIN 左侧的任何项目。
里面select * from range( d.start, d.stop )
是range
横向的。
为什么我不能参考d
表?
解决方案
使用派生表,您需要横向关键字:
select *
from dates d
left join lateral (
select * from range( d.start, d.stop )
) x on d.start < d.stop
如果您删除不必要的派生表(又名“子查询”),则横向关键字是可选的(假设您的“范围”函数是一个集合返回函数):
select *
from dates d
left join range( d.start, d.stop ) as x
on d.start < d.stop