-4

请帮助我,我需要对我的维度进行增量处理,以通过 T-SQL 存储历史数据。我正在尝试使用该MERGE语句,但它不起作用,因为此过程会删除目标中存在但源表中不存在的数据。

有人有建议吗?

例如,我有源表:源表是我的 STAGE,
Cod 描述状态
AAA Desc1 MI
BBB Desc 2 TX
CCC Desc 3 MA
在第一次加载中,我的维度将等于 STAGE

但是我可以更改源表中的值,例如

AAA 更改说明 Mi

所以,我需要像这样更新我的维度:
Cod Descript State
AAA Desc1 Mi before
AAA CHANGEDESCRIPTION MI 实际
BBB Desc 2 TX 实际
CCC Desc 3 MA 实际
这是我的 DW,我需要实际信息和所有历史

4

2 回答 2

0

尝试这个。当前记录的列Aging始终为“0”,表示更改生成:

SELECT * INTO tbl_Target FROM (VALUES
('AAA','Desc1','MI',0),('BBB','Desc 2','TX',0),('CCC','Desc 3','MA',0)) as X(Cod, Descript, State, Aging);
GO
SELECT * INTO tbl_Staging FROM (VALUES ('AAA','Desc4','MI')) as X(Cod, Descript, State);
GO
UPDATE t SET Aging += 1
FROM tbl_Target as t
INNER JOIN tbl_Staging as s on t.Cod = s.Cod;
GO
INSERT INTO tbl_Target(Cod, Descript, State, Aging)
SELECT Cod, Descript, State, 0
FROM tbl_Staging;
GO
SELECT * FROM tbl_Target;

请注意,如果您在暂存表中有“未更改”的记录,您将得到错误的更改。如果是这样,您必须在两个查询中将它们过滤掉。

于 2016-08-03T17:54:40.663 回答
0

我刚刚评论了删除条款...请告诉我你的想法

        MERGE DimTarget AS [Target] --— begin merge statements (merge statements end with a semi-colon)
        USING TableSource AS [Source]
        ON [Target].ID = [Source].ID AND [Target].[IsCurrentRow] = 1
        WHEN MATCHED AND --— record exists but values are different
        (
                [Target].Dscript <> [Source].Descript
            )
        THEN UPDATE SET --— update records (Type 1 means record values are overwritten)
              [Target].[IsCurrentRow] = 0
             -- , [Target].[ValidTo] = GETDATE()
        WHEN NOT MATCHED BY TARGET --— record does not exist
        THEN INSERT --— insert record
        (
            Descritp
        , [IsCurrentRow]
        )
        VALUES
        (
        Descript
        , 1
        )
       --WHEN NOT MATCHED BY SOURCE --— record exists in target but not source
       --THEN DELETE -- delete from target
        OUTPUT $action AS Action, [Source].* --— output results
于 2016-08-03T22:44:51.847 回答