4

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

国家:

ID Name
1  France

城市:

ID Name  Country_ID
1  Lyon  1

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

ID Name  Country_ID
1  Lyon  1
2  Paris 2

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

你知道如何解决它吗?当然,可能会有更困难的情况,涉及 3 个或更多表以及后续连接。

4

2 回答 2

2

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

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

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

另一种选择是将连接作为变更捕获过程的一部分进行 - 当将行加载到城镇时,触发器会关闭,将外键值加载到关联的临时表(国家等)中。

于 2013-01-20T19:17:33.773 回答
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).

您可以将该不匹配联接中的 Country ID 值默认为指定为“不匹配值”的值,通常使用 0 或 -1 或一系列标准负数,您可以稍后将描述分配给这些数字,以确定数据对您不利的原因例如 -1 可以是“Found Town without Country”。

于 2013-01-17T22:52:00.283 回答