合并表的存储过程

时间:2016-01-21 00:22:16

标签: sql-server sql-server-2014

我正在客户的销售数据智能上做一些工作,为他们的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中不存在。

1 个答案:

答案 0 :(得分:1)

指定已填充的表格z888Customerz999Customer

据我了解,以下是您描述的用于重复数据删除的案例:

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作为匹配键。所以你需要注意这些事情:

  • 如果DebtorID 63从数据库中删除但后来被重新创建为该数据库中新的完全债务人重用相同的ID,则不会反映出来 - 旧的将保持不变
  • 如果您有两个不同的数据库,我保证它们会分歧。我建议您将'历史'数据库更改为只读(ALTER DATABASE SET READ_ONLY,同时将文件系统中的文件设置为只读)否则人们会弄乱,你会遇到问题
  • 我上面只提供了INSERT个案例。没有更新。这意味着如果债务人更改了源中的名称,它将不会反映在您的数据仓库中,因为只有一个插入步骤而不是更新一个

这些与您的“复制”有关,即您正在合并数据,您需要为每个案例决定规则

哦,还有一件事要考虑使用模式来分隔你的表(不是z前缀)

所以你的维度可能是dbo.DimCustomer,你的登台可能是staging.888Customer。虽然分段通常是一个完全不同的数据库。