假设我有一个“主”表,该表可能已高度规范化,并且主要由仅包含查找其他表的代码的列组成(它们可能是外键,但如果有意义,请不要在您的答案中假设)。例如,也许这个主表是一个人员列表,其中一列是 for favorite_color
。当然,我们的查找表看起来像这样:
color_cd color_name
0 Unknown
1 Red
2 Blue
3 Orange
4 Other
现在,如果我要从这个主表创建报告,或者可能将这些数据输入到某些软件中供领域专家使用,我宁愿用查找表中的代码替换favorite_color
代码。color_name
当然,一种解决方案是在我的 SELECT 中使用简单的 JOIN 来执行此操作:
SELECT main.col1, main.col2, colors.color_name as `Favorite Color`
FROM main LEFT OUTER JOIN colors ON (main.favorite_color = colors.color_cd);
这可以完成工作。现在假设主表有几十个甚至几百个这样的列和数百万行。一些查找表很小,如上面的示例,但其他查找表可能有数百或数千个值。
是否有任何一种标准的方式来进行这种转换,或者是否有几十个或几百个连接的长篇大论?这种类型的东西是任何 ETL 产品的典型组件吗?是否最好编写一个脚本来处理这个没有连接和 SQL 之外的?请原谅可能存在一些滥用或误用术语的情况;我什至不确定上述过程是否有名称。
在 ETL 过程中,您可以在加载目标表时将代码替换为名称。我将专注于 Informatica PowerCenter,但我确信其他 ETL 工具也提供类似的功能。
有一个
Lookup
转换用于DNAME
根据定义的查找匹配标准 ( ) 从关系表(也可能是视图或平面文件)中查找值 (source.DEPTNO = lookup.DEPTNO
)。然后可以将这些值附加到源行并存储在目标表(用于报告)中。执行会话时,
SELECT
将为映射中的每个查找生成一条语句。这些语句对数据源运行一次,结果存储在查找缓存中。稍后,当需要查找某个值时,转换将使用缓存。