合并具有NULL值的数据集

时间:2019-10-17 23:15:32

标签: sql snowflake-data-warehouse

这是我要解决的情况。我正在雪花数据库中执行此操作,但也希望了解其他数据库中的方法。我有两个源表S1和S2。我需要基于id将这些表进行外部连接,然后加载到目标表T中。

我正在使用SQL merge语句,以便基于键列加载到目标T中。记录不一定会存在于S2中,但它可以在将来到达。


Source S1
==========
ColA  ColB  EMP_ID
-------------------
Hello Fred  100
Hello Will  101

Source S2
==============
Colc   EMP_ID
-------------
World  101
Test   101

Target T:
==========
ColA | ColB | EMP_ID | ColC
-------------------------
Hello| Fred | 100    | NULL
Hello| Will | 101    | World
Hello| Will | 101    | Test 

将来:

源S2将具有EMP_ID 100的记录。

Source S2
===========

Colc   EMP_ID
-------------
World  101
Test   101
Unit   100
Sale   100

Target T should look like below

Target T:
==========
ColA | ColB | EMP_ID | ColC
-------------------------
Hello| Fred | 100    | Unit
Hello| Fred | 100    | Sale
Hello| Will | 101    | World
Hello| Will | 101    | Test

Instead of below

Target T:
==========
ColA | ColB | EMP_ID | ColC
-------------------------
Hello| Fred | 100    | NULL
Hello| Fred | 100    | Unit
Hello| Fred | 100    | Sale
Hello| Will | 101    | World
Hello| Will | 101    | Test

我可以删除记录并重新插入。还有其他可以尝试的选择吗?

下面的示例代码:

MERGE INTO T 
using (SELECT COLA, COLB, ID, COLC 
             from S1 left outer join S2
               on S1.EMP_ID = S2.EMP_ID) Source
ON (NVL(Source.EMP_ID,0) = NVL(Target.EMP_ID,0))
  WHEN MATCHED THEN UPDATE
  WHEN NOT MATCHED THEN INSERT

1 个答案:

答案 0 :(得分:1)

我试图帮助复制,但是在Snowflake中的Merge语句花了很多时间。我认为您的合并语法不正确。这应该在雪花中工作。

CREATE TABLE S1
(Cola varchar(10),Colb varchar(10), EMP_ID number);

CREATE TABLE S2
(Colc varchar(10), EMP_ID number);

INSERT INTO S1 values ('Hello', 'Fred',  100), 
('Hello', 'Will',  101);
INSERT INTO S2 VALUES ('World',  101),
('Test',   101);

SELECT * FROM S1; 
SELECT * FROM S2;

CREATE TABLE T (Cola varchar, Colb varchar, EMP_ID number, Colc varchar);

//ref https://docs.snowflake.net/manuals/sql-reference/sql/merge.html
//SELECT COLA, COLB, S1.EMP_ID, COLC 
//FROM S1 LEFT OUTER JOIN S2 ON S1.EMP_ID = S2.EMP_ID;

MERGE INTO T USING ((SELECT COLA, COLB, s1.EMP_ID, COLC 
         from S1 LEFT OUTER JOIN S2
            on S1.EMP_ID = S2.EMP_ID)) a ON (NVL(a.EMP_ID,0) = NVL(T.EMP_ID,0)) 

匹配后删除   未匹配时插入(cola,colb,emp_id,colc)值(a.cola,a.colb,a.emp_id,a.colc);