这是我要解决的情况。我正在雪花数据库中执行此操作,但也希望了解其他数据库中的方法。我有两个源表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
答案 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);