我无法解释在 LATERAL 之后无法 LEFT JOIN 的限制,但这里有两个潜在的解决方法来解决这个问题......
选项 1 - 使用 CTE(公用表表达式)
create or replace view my_view
copy grants
as
with my_cte as (
select
rowid as row_id,
siteData.value:siteID::int as site_id
from
"RAW_DATA" raw,
lateral flatten(datamap:data, outer => true) siteData
)
select
c.row_id,
c.site_id,
es.site_name
from
my_cte c
LEFT join ext_site es on es.siteid = c.site_id
;
选项 2 - 使用内联(匿名)视图
create or replace view my_view
copy grants
as
select
c.row_id,
c.site_id,
es.site_name
from
(
select
rowid as row_id,
siteData.value:siteID::int as site_id
from
"RAW_DATA" raw,
lateral flatten(datamap:data, outer => true) siteData
) c
LEFT join ext_site es on es.siteid = c.site_id
;
就我个人而言,我会使用 CTE 方法,因为我发现它更具可读性。
关于您的使用outer => true
,仅当 VARIANT 结构在某种程度上不一致且不保证存在时才需要data
你的关键datamap
具有一个值(数组或字典)的字典,该值本身包含一个或多个元素或属性。如果不需要,那么我会将其删除。