我有一个变量数据类型,正在执行横向展平,但是然后我需要左联接一个json元素,以从Snowflake中的另一个关系表中查找对应ID的值。当我这样做时,它给我错误“横向视图不能在联接的左侧”,这是没有意义的,因为如果我不包括外部联接,则创建一个视图,然后在该视图的顶部创建另一个视图此视图使我可以执行左联接。
示例:
create or replace view my_view
copy grants
as
select
rowid as row_id,
siteData.value:siteID::int as site_id,
es.site_name AS site_name
from
"RAW_DATA" raw,
lateral flatten(datamap:data, outer => true) siteData
LEFT join ext_site es on es.siteid = siteData.value:siteID
;
答案 0 :(得分:1)
我无法解释在LATERAL之后无法左联接的限制,但是有两个可能的解决方法...
选项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
字典中存在具有值(数组或字典)本身包含一个或多个元素或属性。如果不需要,那么我将其删除。