左连接稍后展平的工作方式与左连接不同,但与内连接相同

问题描述 投票:0回答:1

我有这样的疑问:

create or replace table test_json as
select
parse_json('{
            "include": [
                "x",
                "y",
                "z"
            ]
        }') AS val
union all
select
parse_json('{
  "exclude": [
    "a",
    "b"
  ],
  "include": [
    "d",
    "e"
  ]
}');
with source_cte as (
select val, i.value::TEXT as include_symbol
from test_json, lateral flatten(input=>val:include) as i
)
select
include_symbol,
e.value::TEXT as exclude_symbol
from source_cte LEFT JOIN LATERAL FLATTEN(input=>val:exclude) e

结果如下:

INCLUDE_SYMBOL    EXCLUDE_SYMBOL
     d                  a
     d                  b
     e                  a
     e                  b

它不会返回包含 = x, y, z 的行,就像我使用 INNER JOIN LATERAL FLATTEN 一样,但我使用的是 LEFT JOIN。

这是雪花中的一些错误吗? 对于这种情况如何实现 LEFT JOIN 行为?我的意思是显示 include_symbol 无论是否在

left join lateral flatten
表达式中找到匹配(并在这种情况下在 exclude_symbol 列中显示空值)。

sql snowflake-cloud-data-platform flatten lateral-join
1个回答
0
投票

这可以写得更简单:

with test_json(val) as (
    select parse_json($1) from values
        ('{"include": ["x","y","z"]}'),
        ('{"exclude":["a","b"],"include":["d","e"]}')
)
select 
    val
    ,i.value::TEXT as include_symbol
    ,e.value::TEXT as exclude_symbol
from test_json, 
    table(flatten(input=>val:include)) as i,
    table(flatten(input=>val:exclude)) as e;

然后迈克指出的修复可以用于排除展平:

with test_json(val) as (
    select parse_json($1) from values
        ('{"include": ["x","y","z"]}'),
        ('{"exclude":["a","b"],"include":["d","e"]}')
)
select 
    val
    ,i.value::TEXT as include_symbol
    ,e.value::TEXT as exclude_symbol
from test_json, 
    table(flatten(input=>val:include)) as i,
    table(flatten(input=>val:exclude, outer=>true)) as e;

enter image description here

然后也可以删除 val:

with test_json(val) as (
    select parse_json($1) from values
        ('{"include": ["x","y","z"]}'),
        ('{"exclude":["a","b"],"include":["d","e"]}')
)
select 
    i.value::TEXT as include_symbol
    ,e.value::TEXT as exclude_symbol
from test_json, 
    table(flatten(input=>val:include)) as i,
    table(flatten(input=>val:exclude, outer=>true)) as e;

enter image description here

对于您的桌子来说,如下所示:

select 
    i.value::TEXT as include_symbol
    ,e.value::TEXT as exclude_symbol
from test_json, 
    table(flatten(input=>val:include)) as i,
    table(flatten(input=>val:exclude, outer=>true)) as e;
© www.soinside.com 2019 - 2024. All rights reserved.