来自不同数据源的产品表合并过程
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 之后引入的,并且针对不同的地区,但是产品将是相同的产品。以上是关于来自不同数据源的产品表合并过程的主要内容,如果未能解决你的问题,请参考以下文章