【发布时间】:2009-03-06 19:30:04
【问题描述】:
我需要帮助来确定工作流程,但我不知道该怎么做...假设我正在将(ETL?)数据从表 A 转换到表 B。表 A 有一个复合主键 A .a+A.b+A.c,而表 B 只有一个自动填充的标识列。如何将 A 中的复合键映射回插入 B 时创建的标识?
最好我不希望表 B 中的任何列与 A 的复合键相关,因为还有许多其他表需要进行相同的操作但没有相同的复合键结构。
【问题讨论】:
标签: sql-server database etl
我需要帮助来确定工作流程,但我不知道该怎么做...假设我正在将(ETL?)数据从表 A 转换到表 B。表 A 有一个复合主键 A .a+A.b+A.c,而表 B 只有一个自动填充的标识列。如何将 A 中的复合键映射回插入 B 时创建的标识?
最好我不希望表 B 中的任何列与 A 的复合键相关,因为还有许多其他表需要进行相同的操作但没有相同的复合键结构。
【问题讨论】:
标签: sql-server database etl
如果我理解正确,您不能在转换后将表 B 中的记录关联回表 A 的记录,除非您在转换期间以某种方式捕获 A 的复合键和 B 的标识符之间的映射。
您可以向 A 添加一列并预先计算插入 B 时要使用的标识符。然后您将获得一个映射。如果您不想向 A 添加列,这也可以使用单独的映射表来完成。
如果您不想覆盖标识符的默认分配,则必须在加载期间捕获它们。为此,Oracle 在 PL/SQL 中为insert 提供了returning 子句。我不确定 SQL Server。也可以通过在 B 上使用触发器插入单独的映射表或更新 A 中的列来完成此操作。尽管这可能会大大减慢您的负载。
如果不出意外,您可以在 B 中创建额外的列以在加载期间保存 A 的键,然后将映射查询到单独的表中,然后删除额外的列。
希望对你有帮助。
【讨论】:
问问自己究竟需要原始密钥做什么。答案可能因源系统而异。这可能会导致您维护“源系统”列和“原始源键”列。后者可能需要是原始键的逗号分隔列表。
或者,您可能会发现您实际上不需要映射回来,因此不需要保留任何东西。
【讨论】: