使用ETL中的表连接更改数据捕获

时间:2013-01-16 13:44:32

标签: join data-warehouse etl cdc

在我的ETL过程中,我使用变更数据捕获(CDC)来仅发现自上次提取以来源表中已更改的行。然后我只对这行进行转换。问题是,当我有两个表,我想加入一个维度,只有其中一个已经改变。例如,我有表国家和城镇如下:

国家:

ID Name
1  France

城镇:

ID Name  Country_ID
1  Lyon  1

现在假设在Towns表中添加了一个新行:

ID Name  Country_ID
1  Lyon  1
2  Paris 2

States表尚未更改,因此这些表的CDC仅向我显示Towns表中的行。问题是当我在国家和城镇之间进行连接时,国家/地区更改集中没有行,因此连接将导致空集。

你知道如何解决它吗?当然可能会有更多困难的案例,包括3个或更多的表格,以及相应的连接。

2 个答案:

答案 0 :(得分:2)

这是执行实时更改 - 数据捕获时发现的典型问题,甚至是每日仅增量更改。

有多种方法可以解决这个问题。

一种方法是在维度或映射表中的自然键上进行连接,以获取相关联的国家/地区(SELECT distinct country_name,[.other attributes ..]来自dim_table,其中country_id = X)。

另一种替代方法是将连接作为更改捕获过程的一部分进行操作 - 当行加载到城镇时,触发器会关闭,将外键值加载到关联的临时表(国家/地区等)。

答案 1 :(得分:0)

我可以喋喋不休地获取更多信息,但我将具体到你问题中的内容。我会建议以下内容来得到结果...

1st Pass is where everything matches via the join... 
Union All 
2nd Pass Gets all towns where there isn't a country
(left outer join with a where condition that 
requires the ID in the countries table to be null/missing).

您会将该不匹配联接中的国家/地区ID值默认为指定为“不匹配值”的内容,通常使用0或-1或一系列标准负数,您可以在以后分配说明以确定数据的原因对你的例子不好-1可能是“没有国家的发现城镇”。