2017-01-23 4 views
1

Я пытаюсь реализовать медленное изменение размера с 2 по T-SQL, но я не могу понять, как подать запрос на работу.SQL Server - Как использовать заявление о слиянии для медленного изменения размера с более чем двумя условиями?

Столбцы таблицы: cpf, nome, telefone_update, endereco_insert

В принципе логика: если MATCHне произойдет с помощью cpf, то запись должна быть вставлена; если произошел MATCH, но изменилось только поле telefone_update, нет необходимости в другой записи, и я просто хочу ОБНОВИТЬ и переопределить значения; если произошел MATCH, но изменилось только поле endereco_insert. Я хочу добавить новую запись и обновить даты начала и окончания.

То, что я до сих пор:

insert into #dm_lucas_tst ( 
           [cpf], 
           [nome], 
           [telefone_update], 
           [endereco_insert], 
           [dt_scd_start], 
           [dt_scd_end], 
           [nu_scd_version] 
          ) 
select [cpf], 
     [nome], 
     [telefone_update], 
     [endereco_insert], 
     cast(dateadd(month, datediff(month, 0, getdate()), 0) as date) as [dt_scd_start], 
     '2199-12-31' AS [dt_scd_end], 
     1 AS [nu_scd_version] 
from (
      merge edw.dim.dm_lucas_tst as Target 
      using edw.dim.stg_lucas_tst as Source 
       on Target.cpf = Source.cpf 
      when not matched by target 
      then 
       insert (
         [cpf], 
         [nome], 
         [telefone_update], 
         [endereco_insert], 
         [dt_scd_start], 
         [dt_scd_end], 
         [nu_scd_version] 
         ) 
       values (
         Source.[cpf], 
         Source.[nome], 
         Source.[telefone_update], 
         Source.[endereco_insert], 
         cast(dateadd(month, datediff(month, 0, getdate()), 0) as date), 
         '2199-12-31', 
         1 
         ) 
      when matched 
      and Source.telefone_update <> Target.telefone_update 
      and Target.dt_scd_end = '2199-12-31' 
      then 
       update set telefone_update = Source.telefone_update 
      output $ACTION ActionOut, 
         Source.[cpf], 
         Source.[nome], 
         Source.[telefone_update], 
         Source.[endereco_insert]     
     ) AS MergeOut 
where MergeOut.ActionOut = 'UPDATE'; 

Но я не думаю, что поставление другого WHEN MATCH AND ... сделает эту работу.

Любые предложения?

Заранее благодарен!

+0

эй @ Лукас, вы разобрались с этой проблемой? –

+0

@KamilNowinski не очень. Я решил перейти и вставить новую строку вообще. –

+0

привет @ Лукас, будет ли это решение, представленное ниже, помочь? –

ответ

0

Соответственно вашему описанию, я предполагаю, что вам нужно:

  • SCD Type 1 для столбца [telefone_update]
  • SCD Type 2 для столбца [endereco_insert]

Я вы использовали приложение SCD Merge Wizard, чтобы легко создать описанную логику. Когда я делал тесты для него - все выглядит так, как ожидалось, я думаю. Я описал процесс в своем блоге - пожалуйста, посмотрите и скажите, было ли это именно то, что вы хотели?

https://sqlplayer.net/2018/01/scd-type-1-type-2-in-merge-statement/

 Смежные вопросы

  • Нет связанных вопросов^_^