雪花-横向不能在连接的左侧

时间:2020-08-13 14:08:26

标签: snowflake-cloud-data-platform flatten lateral

我有一个变量数据类型,正在执行横向展平,但是然后我需要左联接一个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
;

1 个答案:

答案 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字典中存在具有值(数组或字典)本身包含一个或多个元素或属性。如果不需要,那么我将其删除。