记录历史的 T-SQL 中的增量负载
Posted
技术标签:
【中文标题】记录历史的 T-SQL 中的增量负载【英文标题】:Incremental load in T-SQL with recorded history 【发布时间】:2016-08-03 16:23:54 【问题描述】:请帮助我,我需要对我的维度进行增量处理,以便通过 T-SQL 存储历史数据。我正在尝试使用MERGE
语句,但它不起作用,因为此过程会删除目标表中存在但源表中不存在的数据。
有人有什么建议吗?
例如我有源表:源表是我的 STAGE, 代码描述状态 AAA Desc1 MI BBB Desc 2 TX CCC Desc 3 MA 在第一次加载时,我的维度将等于 STAGE
但是我可以更改源表中的值,例如
AAA CHANGEDECRIPTION Mi
所以,我需要像这样更新我的维度: 代码描述状态 AAA Desc1 Mi before AAA CHANGEDECRIPTION MI 实际 BBB Desc 2 TX 实际 CCC Desc 3 MA 实际 这是我的 DW,我需要实际信息和所有历史记录
【问题讨论】:
请展示一些示例数据和预期结果 我用例子更新了问题 【参考方案1】:试试这个。对于当前记录,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;
请注意,如果暂存表中有“未更改”的记录,您将得到错误的更改。如果是这样,您必须在两个查询中过滤掉它们。
【讨论】:
Tks for anwser 我试着像这样忽略合并中的 DELETE 语句...当源不匹配时删除我评论了源不匹配时的分句,现在可以了 你对此有何看法解决方案?好用吗? 请发布您的代码作为答案。您必须在 100% 的时间内执行Insert
,但如果匹配,您还必须执行 UPDATE
。我看不出您如何将MERGE
用于该特定解决方案。【参考方案2】:
我刚刚评论了删除条款...请告诉我你的想法
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
【讨论】:
以上是关于记录历史的 T-SQL 中的增量负载的主要内容,如果未能解决你的问题,请参考以下文章