来自不同数据源的产品表合并过程

Posted

技术标签:

【中文标题】来自不同数据源的产品表合并过程【英文标题】:product table consolidation process from different data sources 【发布时间】:2018-04-17 20:41:11 【问题描述】:

我们公司曾经有onpremiere和云ERP系统,他们 最后想从每个 ERP 系统中提取数据到暂存数据库 在我们的数据仓库中。这两个系统在表结构方面是相同的 和模式然而,我们需要合并几个表来创建一个唯一的表。 例如,来自 ERP1 的 dbo.Product 和来自 ERP2 系统的 dbp.Product 具有重叠的 productId(s) 在不破坏数据完整性的情况下合并这两个表的理想情况是什么

示例: ERP1.产品( ProductId int , 产品名称 varchar(90), 产品 varchar(MAX) )

ERP2.Product( ProductId int , 产品名称 varchar(90), 产品 varchar(MAX) )

【问题讨论】:

【参考方案1】:

UNION 可以工作

select * from ERP1 
union 
select * from ERP2

UNION 返回不同的值,而UNION ALL 返回所有可能重复的值。自然,每条语句必须返回相同数量的列,并且具有匹配的数据类型。

如果您想动态创建表,可以在第一条语句中使用INTO 子句

select * from Server1.dbo.ERP1
into thisServer.dbo.StagingTable
union 
select * from Server2.dbo.ERP2

【讨论】:

谢谢@scsimon 我想我可能需要在这里再添加一个条件。我们应该依赖 ERP1,如果有产品,我们应该从 ERP1 中选择一个,如果没有,则使用来自 ERP2 的产品。我也很好奇是否需要跟踪足迹,例如哪些产品来自哪个桌子。 如果完全相同,为什么选择ERP1而不是2?【参考方案2】:

这里最大的问题是,当产品 ID 重叠时,是否需要在合并时尊重这一事实?即它们是否真的是同一种产品,或者重叠是偶然的?

如果需要尊重重叠/确实/,那么我建议您需要在产品名称/描述不同的情况下确定哪个是主要来源,然后以一种方式加载数据仓库表忽略来自次要来源的重复项,例如:

... where erp2product.productid not in (select erp1product.productid from erp1product) 

如果没有“真正的”重叠,那么我倾向于在产品 id 的前面加上一个前缀(或添加一个“源”列)以在数据仓库中区分它们,尽管显然任何其他表在包含产品 ID 的数据仓库中必须遵循相同的规则。

【讨论】:

好问题。是的!我们允许重叠,因为 ERP2 是在 ERP1 之后引入的,并且针对不同的地区,但是产品将是相同的产品。

以上是关于来自不同数据源的产品表合并过程的主要内容,如果未能解决你的问题,请参考以下文章

合并来自不同粒度维度的数据

在Access中合并两个表?

如何合并来自不同数据库的数据?

将来自多个 API 端点的数据合并到一个数据库中

如何合并来自不同表的记录?

SAP Marketing Cloud的Contact导入配置和数据合并原理