首页 > 解决方案 > 为什么我在加入横向功能时不能参考表格?

问题描述

我有疑问:

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表?

标签: postgresql

解决方案


使用派生表,您需要横向关键字:

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

推荐阅读