Слить, удалить, когда не на Source - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема с оператором слияния в FACT TABLE

Это было довольно просто, пока пользователи не начали удалять записи из источника.

Текущий SQL:

Set Count = 1
WHEN NOT MATCHED
   INSERT
WHEN MATCHED
 UPDATED

Новый SQL:

Таким образом, в этом примере запись была удалена из источника, она больше не соответствует, но вставлять нечего.Я хотел бы, чтобы счет был установлен на 0.

WHEN DELETED FROM SOURCE
Set Count = 0

.

Source
Bob Jones |  1111 
Mary Jones |  1112 
James Jones |  1113 
Helen Jones |  1114

TARGET
Bob Jones |  1111 | Count 1
Mary Jones |  1112| Count 1
James Jones |  1113| Count 1
Helen Jones | | 1114| Count 1
Peter Market |  1115| Count 0 

Я загружаю в таблицу фактов с помощью слияния, и теперь они просто удаляют записиМои факты отключены.Это как-то надо учитывать?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете выполнить слияние, используя цель full outer join, отредактированную с источником, но id должен иметь уникальный ключ для обоих, чтобы это работало.

MERGE INTO target tgt 
USING (SELECT CASE 
                WHEN s.id IS NULL THEN t.name --write this logic for all other non id columns.
                ELSE s.name 
              END     AS name, 
              coalesce(s.id, t.id) AS id, --use target's id when no source id is available
              CASE 
                WHEN s.id IS NULL THEN 0 --zero for non matching ids
                ELSE 1 
              END      AS source_count 
       FROM   target t 
              full outer join source s 
                           ON s.id = t.id) src 
ON ( src.id=tgt.id) 
WHEN matched THEN 
  UPDATE SET tgt.name = src.name, 
             tgt.source_count = src.source_count 
WHEN NOT matched THEN 
  INSERT (id, 
          name, 
          source_count) 
  VALUES(src.id, 
         src.name, 
         1) ; --insert 1 by default for new rows

Демо

...