2013-01-16 37 views
2

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

国家

ID Name 
1 France 

城镇:

ID Name Country_ID 
1 Lyon 1 

现在让我们说一个新的行被添加到城镇表:

ID Name Country_ID 
1 Lyon 1 
2 Paris 2 

国家表格尚未更改,因此这些表格的CDC仅显示了来自Towns表格的行。问题是当我在国家和城镇之间进行连接时,在国家/地区没有变化集合,因此连接会导致空集。

你知道如何解决它吗?当然,可能会有更多困难的情况,涉及3个以上的表格,以及相应的联接。

回答

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可能是“Found Town Without Country”。

1

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

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

一种方法是对维或映射表中的自然键进行连接,以从dim_table where country_id = X获取关联的国家(SELECT distinct country_name,[.. other attributes ..])。

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