如何在雪花的左外连接期间提取所有值(即使是那些不匹配的值)?

Posted

技术标签:

【中文标题】如何在雪花的左外连接期间提取所有值(即使是那些不匹配的值)?【英文标题】:How to pull all values (even those that don't match) during a left outer join in Snowflake? 【发布时间】:2020-12-22 18:33:21 【问题描述】:

我有两个表(表 a 为 130 万行,表 b 为 30 万行),我想通过电子邮件地址加入它们。但是,表 b 中只有 1/3 的地址与表 a 匹配。理想情况下,输出应该是 col1 中表 a 的长度,col2 将是表 b 中的所有 300k 行,col3 会根据 col1 和 col2 是否填充而说“映射”或“未映射”。

我想显示表 b 中的所有地址(即使是那些与表 a 不匹配的地址)和表 a 以及显示它们匹配或不匹配的第三列。现在它只显示为 NULL。

如何在 SQL 中执行此操作?当前使用左外连接,但可能需要使用完全连接?

SELECT DISTINCT TABLEA.EMAIL, TABLEB.EMAIL_ADDRESS FROM "db_tablea" TABLEA
left outer JOIN
"db_tableb" TABLE B
ON TABLEA.EMAIL = TABLEB.EMAIL_ADDRESS
CASE WHEN EMAIL IS NULL AND EMAIL_ADDRESS IS NOT NULL THEN 'NOT_MAPPED'
WHEN EMAIL IS NOT NULL AND EMAIL_ADDRESS IS NOT NULL THEN 'MAPPED'
ELSE 'REVIEW'
END AS MAPPED_FLAG
ORDER BY EMAIL
;

【问题讨论】:

【参考方案1】:

我会使用exists 和相关子查询:

select a.*, 
    case when exists (select 1 from tableb b where b.email_address = a.email)
        then 'mapped'
        else 'not mapped'
    end as review
from tablea a

这会为第一个表中的每一行生成一行,并带有一个标志,指示电子邮件是否存在于第二个表中。

一个特点是第一个表中在第二个表中有多个匹配项的行在结果集中不会“相乘”。

【讨论】:

感谢您的解释 - 我无法在查询中只调用我想要的字段而不是 a.* - 我正在使用 a.email 但它说它不是有效的 id..跨度> @Dinho:atablea 的别名,因此您可以访问该表的任何列。 select a.email, case ... end as review from tablea a【参考方案2】:
SELECT
    a.email
    ,b.email
    ,CASE WHEN a.email = b.email THEN 'MAPPED' ELSE 'NOT MAPPED' END status
FROM
    table_a a
    FULL OUTER JOIN table_b b ON (a.email = b.email)
;

https://www.db-fiddle.com/f/sWn6RS8GsfRhj5oXwS3Dso/0

【讨论】:

感谢帮助/链接!【参考方案3】:

允许更深入地了解不匹配的记录的细微变化

select t1.email, 
       t2.email_address, 
       case when t1.email is null then 'a not mapped to b' 
            when t2.email_address is null then 'b not mapped to a' 
            else 'mutually mapped' end as mapping_flag
from table_a t1 
full join table_b t2 on t2.email_address = t1.email;

【讨论】:

以上是关于如何在雪花的左外连接期间提取所有值(即使是那些不匹配的值)?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ:具有多个条件的左外连接

如何在 obiee 的左外连接的一部分中包含分析过滤器(左连接变为内连接)

带条件sql的左外连接

Linq中的左外连接

真正的左外连接

如何在 Yii2 中创建复杂的左外连接?