Объединение наборов данных со значениями NULL - PullRequest
0 голосов
/ 18 октября 2019

Вот сценарий, который я пытаюсь решить. Я делаю это в SnowkeDB, но хотел бы увидеть подходы и в других базах данных. У меня есть две таблицы источников S1 и S2. Мне нужно внешнее соединение этих таблиц на основе идентификатора и загрузки в целевую таблицу T.

Я использую оператор слияния SQL для загрузки в целевой 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 Ответ

1 голос
/ 18 октября 2019

Я пытался помочь воспроизвести, но черт побери с заявлением Merge в Snowflake. Я считаю, что ваш синтаксис для слияния не является правильным. Это должно работать в Снежинке.

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);

...