在我的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个或更多的表格,以及相应的连接。
答案 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可能是“没有国家的发现城镇”。