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

Tom*_*aly 6 flatten lateral snowflake-cloud-data-platform

我有一个变体数据类型,我正在对其执行横向展平,但随后我需要左连接其中一个 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
;
Run Code Online (Sandbox Code Playgroud)

Dar*_*ner 7

我无法解释在 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
;
Run Code Online (Sandbox Code Playgroud)

选项 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
;
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我会使用 CTE 方法,因为我发现它更具可读性。

关于 的使用outer => true,仅当 VARIANT 结构在某种程度上不一致时才需要这样做,并且不能保证字典datadatamap存在一个键,该键的值(数组或字典)本身包含一个或多个元素或属性。如果不需要,那么我会将其删除。