我正在客户的销售数据智能上做一些工作,为他们的ERP添加新的连接。客户保留旧数据库('888')仅用于制造,并为销售创建了新的'999'数据库。所有历史记录均保留在888年至12月31日,新的销售额从2016年1月1日起为999。
我现在已经设置了所有SQL Server表和视图,以使用新表和视图作为888和999的复制品来查询888和999的ERP。现在我想要888和999的联合数据集,所以我们有一个数据集。
我很乐意为fact
表创建联合,因为不应该有重复的记录,但是想要在昏暗的表上有一些指导。
客户和产品在ERP中从888复制到999,所以我绝对将重复,但我只想拥有999的单个版本。但是,说客户被删除从999开始,我仍然会有888年的历史,所以需要加入它。
我在想的是我实际上不能做一个联合(因为重复),而是我认为我需要创建某种过程来插入来自999表的所有记录,然后处理888反对,添加目标中不存在的记录。
我的问题是我真的不知道如何编写这样的存储过程。如果我将Customer
维度视为示例,则主键为[Order_Debtor]
,描述性列的示例为[Order_Debtor_Description]
。
我正在寻找的是编写代码的指导,该代码可以从999.customer
插入到merged.customer
,然后从888.customer
检查并插入merged.customer
它在merged.customer
中不存在。
答案 0 :(得分:1)
指定已填充的表格z888Customer
和z999Customer
据我了解,以下是您描述的用于重复数据删除的案例:
Case z888Customer z999Customer Use Data From
A 123 (doesn't exist) 888
B (doesn't exist) 789 999
C 456 456 888
所以这样做的一种方法是创建一个包含这个的视图:
-- Case A - only 888 records that are not in 999
SELECT Debtor_ID, Field1, Field2
FROM z888Customer
WHERE NOT EXISTS (
SELECT *
FROM z999Customer
WHERE z999Customer.Debtor_ID = z888Customer.Debtor_ID
)
UNION ALL
-- Case B and C
SELECT Debtor_ID, Field1, Field2
FROM z999Customer
假设该视图称为LoadCustomers,则只能使用以下内容加载新视图:
INSERT INTO CustomerDimension (Field1,Field2,DebtorID)
SELECT Field1,Field2,DebtorID FROM LoadCustomers
WHERE NOT EXISTS (
SELECT *
FROM DimCustomer
WHERE DimCustomer.DebtorID = LoadCustomer.DebtorID
)
所以这将继续添加内容。即使它从源中删除,也不会从维度中删除,因为没有运行删除语句
我们在这里使用Debtor_ID作为匹配键。所以你需要注意这些事情:
ALTER DATABASE SET READ_ONLY
,同时将文件系统中的文件设置为只读)否则人们会弄乱,你会遇到问题INSERT
个案例。没有更新。这意味着如果债务人更改了源中的名称,它将不会反映在您的数据仓库中,因为只有一个插入步骤而不是更新一个这些与您的“复制”有关,即您正在合并数据,您需要为每个案例决定规则
哦,还有一件事要考虑使用模式来分隔你的表(不是z前缀)
所以你的维度可能是dbo.DimCustomer,你的登台可能是staging.888Customer。虽然分段通常是一个完全不同的数据库。