Я пытаюсь загрузить стандартное измерение Kimball SCD2, используя оператор слияния, который я получил со следующего веб-сайта: http://www.kimballgroup.com/2008/11/design-tip-107-использование-оператора-sql-слияния-для-медленно-изменяющейся-обработки-измерения/
Этот оператор слияния такой же, за исключением обработки новых сущностей. Это будет обработано как прямая вставка в поток данных. Эта проблема касается только нескольких версий одного и того же бизнес-ключа.
Когда я выполняю оператор слияния, SQL возвращает ошибку:
Сообщение 8672, уровень 16, состояние 1, строка 3
Оператор MERGE попытался выполнить ОБНОВЛЕНИЕ или УДАЛЕНИЕ одной и той же строки более одного раза. Это происходит, когда целевая строка соответствует более чем одной исходной строке.
Операция MERGE не может ОБНОВЛЯТЬ/УДАЛИТЬ одну и ту же строку целевой таблицы несколько раз. Уточните предложение ON, чтобы целевая строка соответствовала не более чем одной исходной строке, или используйте предложение GROUP BY, чтобы сгруппировать исходные строки.
Я использую SQL Server 2012:
ИСХОДНЫЙ НАБОР ДАННЫХ
ЦЕЛЕВОЙ НАБОР ДАННЫХ
Это то, что я ожидал:
Ниже вы можете найти скрипт для воспроизведения проблемы:
CREATE TABLE SANDBOX.EHN.SOURCE_SCD2 (
BUSINESS_KEY BIGINT
,DESCRIPTION_A VARCHAR(2)
,M_CRC BIGINT
,StartDATE DATE
,EndDATE DATE )
CREATE TABLE SANDBOX.EHN.TARGET_SCD2 (
BUSINESS_KEY BIGINT
,DESCRIPTION_A VARCHAR(2)
,M_CRC BIGINT
,StartDATE DATE
,EndDATE DATE )
select *
from SANDBOX.EHN.TARGET_SCD2
truncate table SANDBOX.EHN.TARGET_SCD2
INSERT INTO SANDBOX.EHN.SOURCE_SCD2 VALUES (1, 'B', 1, '2015-05-16', '2015-06-01')
INSERT INTO SANDBOX.EHN.SOURCE_SCD2 VALUES (1, 'C', 2, '2015-06-01', '2015-06-11')
INSERT INTO SANDBOX.EHN.SOURCE_SCD2 VALUES (1, 'D', 3, '2015-06-11', '9999-12-31')
INSERT INTO SANDBOX.EHN.TARGET_SCD2 VALUES (1, 'A', 0, '2015-01-16', '9999-12-31')
INSERT INTO SANDBOX.EHN.TARGET_SCD2
SELECT BUSINESS_KEY
,DESCRIPTION_A
,M_CRC
,StartDATE
,EndDATE
FROM (
MERGE SANDBOX.EHN.TARGET_SCD2 D
USING SANDBOX.EHN.SOURCE_SCD2 UPD
ON(D.BUSINESS_KEY = UPD.BUSINESS_KEY )
WHEN MATCHED AND D.EndDATE = '9999-12-31'
THEN UPDATE SET D.EndDATE = UPD.EndDATE
OUTPUT $Action Action_Out, UPD.BUSINESS_KEY
, UPD.DESCRIPTION_A
, UPD.M_CRC
, UPD.StartDATE
, UPD.EndDATE
)AS MERGE_OUT
WHERE MERGE_OUT.Action_Out = 'UPDATE'
Можете ли вы помочь мне решить эту проблему?
MERGE
переоценен для SCD. Я всегда использую отдельные INSERT/UPDATE в транзакции. Там больше кода, и он повторяется, но его легче отлаживать. Любопытная вещь в вашем обновлении SCD заключается в том, что источник также ограничен датой. Мало того, что к вам прибывают сразу трое (а не один, как обычно). Так что ваш случай не распространен, но достижим. Это не распространяется ни на одно из онлайн-предложений ванильного SCD. В любом случае, я могу увидеть SQL, который потребуется, и могу опубликовать, если хотите, или я могу объяснить более подробно. - person Nick.McDermaid   schedule 21.11.2016