可以使用源限定符和应用程序源限定符转换在相同的数据库中执行两个源的外部联接。当 PowerCenter 执行外部联接时,它将返回其中一个源表的所有行和另一个源表中匹配联接条件的行。
如果您需要联接两个表并返回其中一个表的所有行,可使用外部联接。例如,当您希望联接注册客户表和每月购买情况表以确定注册客户的购买行为是否活跃时,您就可以执行外部联接。使用外部联接,您可以联接注册客户表和每月购买情况表,并返回注册客户表中的所有行,包括上个月无购买行为的客户。如果您执行正常联接,PowerCenter 将仅返回在该月内有购买行为的注册客户,以及仅由注册客户进行的购买行为。
使用外部联接,您可以在联接转换中生成与主外部联接或细节外部联接相同的结果。但是,使用外部联接将减少数据流中的行数。这可以提高性能。
PowerCenter 支持两种外部联接:
注: 覆盖默认查询时,您可以在外部联接中使用嵌套查询语句。
输入联接语法时,您可以使用 Informatica 或数据库特定的联接语法。使用 Informatica 联接语法时,PowerCenter 将在会话期间转化语法并将它传递至源数据库。
注:始终为联接条件使用数据库特定的语法。
使用 Informatica 联接语法时,将整个联接语句用大括号括起来 ({Informatica syntax})。使用数据库语法时,输入源数据库支持的语法,不要用大括号括起。
使用 Informatica 联接语法时,使用表名称作为列名称的前缀。例如,如果在 REG_CUSTOMER 表中具有名为 FIRST_NAME 的列,请在联接语法中输入 "REG_CUSTOMER.FIRST_NAME"。另外,使用别名作为表名称时,请使用 Informatica 联接语法内的别名以确保 PowerCenter Server 能识别别名。
下表列出了创建外部联接时可以在不同位置为不同源限定符转换输入的联接语法:
转换
|
转换设置
|
说明
|
---|---|---|
源限定符转换
|
用户定义的联接
|
创建联接覆盖。会话期间,PowerCenter 将联接覆盖附加至默认查询的 WHERE 子句后。
|
SQL 查询
|
直接在默认查询的 WHERE 后输入联接语法。
|
|
应用程序源限定符转换
|
联接覆盖
|
创建联接覆盖。会话期间,PowerCenter 将联接覆盖附加至默认查询的 WHERE 子句后。
|
提取覆盖
|
直接在默认查询的 WHERE 后输入联接语法。
|
可以在单个源限定符中将左外联接和右外联接与正常联接合并。您可以使用多个正常联接和多个左外联接。
合并联接时,请按以下顺序输入联接:
可以在源限定符中使用联接条件来创建正常联接。但是,创建外部联接时,您需要覆盖默认联接才能执行外部联接。因此,您需要在联接覆盖中包括正常联接。在联接覆盖中合并正常联接时,先列出正常联接,再列出外部联接。您可以在联接覆盖中输入多个正常联接。
要创建正常联接,请使用以下语法:
{ source1
INNER JOIN
source2
on
join_condition
}
下表是联接覆盖中显示正常联接的语法:
语法
|
说明
|
---|---|
source1
|
源表名称。PowerCenter 将从此表中返回与联接条件匹配的行。
|
source2
|
源表名称。PowerCenter 将从此表中返回与联接条件匹配的行。
|
join_condition
|
联接条件。使用源数据库支持的语法。您可以通过 AND 运算符组合多个联接条件。
|
例如,您具有包含注册客户数据的 REG_CUSTOMER、每月刷新一次的 PURCHASES 表
要返回显示六月份每次交易相关的客户名称的行,可使用以下语法:
{ REG_CUSTOMER INNER JOIN PURCHASES on REG_CUSTOMER.CUST_ID = PURCHASES.CUST_ID }
PowerCenter 将返回具有匹配客户标识的行。它不包括在六月份没有购买行为的客户。它也不包括非注册客户进行的购买行为。
可以使用联接覆盖创建左外联接。您可以在单个联接覆盖中输入多个左外联接。与其它联接一同使用左外联接时,请在语句中任何正常联接后面一并列出所有左外联接。
要创建左外联接,请使用以下语法: { source1
LEFT OUTER JOIN
source2
on
join_condition
}
语法
|
说明
|
---|---|
source1
|
源表名称。对于左外联接,PowerCenter 将返回此表中的所有行。
|
source2
|
源表名称。PowerCenter 将从此表中返回与联接条件匹配的行。
|
join_condition
|
联接条件。使用源数据库支持的语法。您可以通过 AND 运算符组合多个联接条件。
|
例如,使用在 正常联接语法 中描述的相同 REG_CUSTOMER 和 PURCHASES 表,您可以使用以下联接覆盖来确定有多少客户在六月份有购买行为:
{ REG_CUSTOMER LEFT OUTER JOIN PURCHASES on REG_CUSTOMER.CUST_ID = PURCHASES.CUST_ID }
PowerCenter Server 将返回 REG_CUSTOMERS 表中的所有注册客户,并对在六月份没有购买行为的客户使用空值。它不包括非注册客户进行的购买行为。
可以使用多个联接条件来确定有多少注册客户在六月份单次购买花费超过 $100.00:
{REG_CUSTOMER LEFT OUTER JOIN PURCHASES on (REG_CUSTOMER.CUST_ID = PURCHASES.CUST_ID AND PURCHASES.AMOUNT > 100.00) }
如果需要合并同期内退货的信息,您可以使用多个左外联接。
要确定在六月份有多少客户进行了购买和退货,您可以使用两个左外联接:
{ REG_CUSTOMER LEFT OUTER JOIN PURCHASES on REG_CUSTOMER.CUST_ID = PURCHASES.CUST_ID LEFT OUTER JOIN RETURNS on REG_CUSTOMER.CUST_ID = PURCHASES.CUST_ID }
PowerCenter 对缺少的值使用 NULL。
您可以使用联接覆盖创建右外联接。如果逆转联接语法中的表顺序,右外联接将返回与左外联接相同的结果。仅在联接覆盖中使用一个右外联接。如果要创建不止一个右外联接,请尝试逆转源表的顺序,并把联接类型更改为左外联接。
将右外联接与其它联接一起使用时,请在联接覆盖末尾输入右外联接。
要创建右外联接,请使用以下语法:
{ source1
RIGHT OUTER JOIN
source2
on
join_condition
}
语法
|
说明
|
---|---|
source1
|
源表名称。PowerCenter 将从此表中返回与联接条件匹配的行。
|
source2
|
源表名称。对于右外联接,PowerCenter 将返回此表中的所有行。
|
join_condition
|
联接条件。使用源数据库支持的语法。您可以通过 AND 运算符组合多个联接条件。
|
可以将右外联接与左外联接一起使用,以联接和返回两个表中的所有数据,作用与完全外部联接相似。例如,您可以使用以下联接覆盖提取六月份的所有注册客户和所有购买行为:
{REG_CUSTOMER LEFT OUTER JOIN PURCHASES on REG_CUSTOMER.CUST_ID = PURCHASES.CUST_ID RIGHT OUTER JOIN PURCHASES on REG_CUSTOMER.CUST_ID = PURCHASES.CUST_ID }
可以输入外部联接作为联接覆盖或作为默认查询的覆盖的一部分。
创建联接覆盖时,Designer 会把联接覆盖附加到默认查询的 WHERE 子句后。在会话期间,PowerCenter 将转化 Informatica 联接语法并将它包括在用于提取源数据的默认查询中。可能的话,输入联接覆盖而不是覆盖默认查询。
覆盖默认查询时,在默认查询的 WHERE 子句中输入联接语法。在会话期间,PowerCenter 将转化 Informatica 联接语法,然后使用查询来提取源数据。如果在创建覆盖之后更改转换,PowerCenter 将忽略更改。因此,如果可能的话,输入外部联接语法作为联接覆盖。
要创建外部联接作为联接覆盖:
在应用程序源限定符转换中,单击"联接覆盖"字段中的按钮。
请勿在联接的起始处输入 WHERE。PowerCenter Server 在查询行时会添加。
用大括号 ( { } ) 将 Informatica 联接语法括起来。
使用表别名及 Informatica 联接语法时,请在 Informatica 联接语法内使用别名。
将表名称用作列名称前缀,如"表.列"。
使用源数据库支持的联接条件。
输入多个联接时,按类型将联接分组,然后按以下顺序列出:正常、左外、右外。在每个嵌套查询中仅包括一个右外联接。
从"端口"选项卡中选择端口名称以确保准确性。
要创建外部联接作为提取覆盖:
用大括号 ( { } ) 将 Informatica 联接语法括起来。使用表别名及 Informatica 联接语法时,请在 Informatica 联接语法内使用别名。将表名称用作列名称前缀,如"表.列"。使用源数据库支持的联接条件。输入多个联接时,按类型将联接分组,然后按以下顺序列出:正常、左外、右外。在每个嵌套查询中仅包括一个右外联接。从"端口"选项卡中选择端口名称以确保准确性。