2

我有一个变体数据类型,我正在执行横向展平,但我需要左连接其中一个 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
;
4

1 回答 1

6

我无法解释在 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 结构在某种程度上不一致并且不保证字典中存在一个datadatamap的值(数组或字典)本身包含一个或多个元素或属性时才需要。如果不需要,那么我会删除它。

于 2020-08-13T17:33:48.477 回答