如何在Azure Data Factory数据流中添加带ISNULL的JOIN关联条件
在Azure Data Factory数据流中实现带额外条件的左连接
问题背景
你需要将SQL中带ON UpdatedWOV.Id IS NULL AND [关联键]的左连接逻辑迁移到ADF数据流,之前尝试提前加过滤器导致丢失有效记录,核心是要区分过滤左表和连接条件中带额外逻辑的差异。
正确实现步骤
SQL中的left join会保留左表所有行,仅在满足ON子句的所有条件时匹配右表数据。ADF数据流的Join转换支持直接在连接条件中添加布尔逻辑,不需要提前过滤左表:
- 准备数据源:确保数据流中已包含CTH、UpdatedWOV、PT、BT及各类PMS记录表的数据集(可通过源转换或上游转换获取)。
- 处理带
UpdatedWOV.Id IS NULL的左连接(以CTH左连PT为例):- 添加
Join转换,左表选择包含CTH和UpdatedWOV字段的数据集,右表选择PT数据集。 - 连接类型选择
Left outer(对应SQL的left join)。 - 在连接条件面板中:
- 先添加第一个条件:
CTH.Id==PT.TranId - 点击「添加条件」,选择逻辑关系为
And,再添加第二个条件:isNull(UpdatedWOV.Id)(或直接在表达式框输入isNull(UpdatedWOV.Id))
- 先添加第一个条件:
- 配置完成后,该Join转换完全对应SQL中的
left join PT ON UpdatedWOV.Id is null AND CTH.Id = PT.TranId。
- 添加
- 重复处理CTH左连BT的逻辑:用同样的方式设置连接条件为
isNull(UpdatedWOV.Id) AND CTH.Id = BT.TranId。 - 处理无额外条件的左连接:对于连
etl.PmsRecord、etl.PMSExpenseRecord等表的逻辑,直接在Join转换中设置对应的关联键即可(比如CTH.PMSRecordId == PmsRecord.Id),无需添加isNull条件。
为什么之前的方法出错
你之前用Filter转换提前过滤isNull(UpdatedWOV.Id)的行,会直接丢弃左表中UpdatedWOV.Id不为空的所有记录,这违背了SQL左连接的逻辑——SQL的left join会保留左表所有行,仅当UpdatedWOV.Id为空时才尝试匹配右表,UpdatedWOV.Id不为空时右表字段会显示null,但左表行仍会保留。
快捷写法
在ADF Join的表达式编辑器中,也可以直接输入完整的连接逻辑表达式,比如:
isNull(UpdatedWOV.Id) && CTH.Id == PT.TranId
内容的提问来源于stack exchange,提问作者datainstints
相关产品推荐
相关产品推荐

