嵌套JOIN执行顺序及SQL FROM子句执行逻辑咨询(含PowerBI适配)
SQL FROM子句执行顺序解析及PowerBI重构指南
核心疑问解答
你的执行步骤理解是完全正确的:SQL会优先执行括号内的全外连接操作,再将得到的中间结果与关联表执行内连接。
原SQL执行流程拆解
先看你的业务SQL代码:
Select InvWarehouse.StockCode, InvWarehouse.UnitCost, InvInspect.Grn, InvInspect.Lot, InvMaster.Description, InvMaster.Supplier From (InvWarehouse InvWarehouse full outer join InvInspect InvInspect on (InvWarehouse.StockCode=InvInspect.StockCode) and (InvWarehouse.Warehouse=InvInspect.Warehouse)) inner join InvMaster InvMaster on InvInspect.StockCode=InvMaster.StockCode
具体执行步骤:
- 全外连接生成中间表:
将InvWarehouse和InvInspect通过StockCode+Warehouse组合字段做全外连接,得到包含三类记录的中间数据集:- 两张表中完全匹配的记录(所有字段均有值)
- 仅存在于
InvWarehouse的记录(InvInspect侧所有字段为NULL) - 仅存在于
InvInspect的记录(InvWarehouse侧所有字段为NULL)
- 内连接过滤结果:
用上述中间表与InvMaster执行内连接,连接条件为InvInspect.StockCode = InvMaster.StockCode。由于内连接要求连接字段不能为NULL,因此步骤1中仅存在于InvWarehouse的记录(此时InvInspect.StockCode为NULL)会被直接过滤,最终结果等价于InvWarehouse与InvInspect先做右外连接,再和InvMaster内连接。
PowerBI与SQL结果差异的常见原因
- 连接顺序差异:PowerQuery/DAX的默认连接逻辑可能和SQL的执行顺序不一致,比如DAX可能先处理
InvInspect与InvMaster的内连接,再和InvWarehouse做全外连接,导致结果偏差 - NULL值处理逻辑:SQL与PowerBI对NULL值的匹配规则存在细节差异,全外连接后NULL字段的处理方式不同
- 字段大小写敏感性:SQL Server默认不区分字段大小写,但PowerBI对大小写敏感,若连接字段大小写不统一会导致匹配失败
PowerBI重构方案
PowerQuery实现(严格遵循SQL逻辑)
- 导入三张原始表到PowerQuery
- 先执行
InvWarehouse与InvInspect的全外连接:- 选中
InvWarehouse表,点击「合并查询」→ 选择InvInspect表,连接字段勾选StockCode和Warehouse,连接类型选择「全外部」
- 选中
- 再执行中间表与
InvMaster的内连接:- 选中合并后的中间表,点击「合并查询」→ 选择
InvMaster表,连接字段选择InvInspect.StockCode和InvMaster.StockCode,连接类型选择「内部」
- 选中合并后的中间表,点击「合并查询」→ 选择
- 展开需要输出的字段,确保和SQL查询的字段一致
DAX实现(模拟SQL执行顺序)
由于DAX没有原生全外连接函数,需手动模拟:
- 创建全外连接中间表:
FullJoin_InvWarehouse_InvInspect = // 左外连接部分 NATURALLEFTOUTERJOIN(InvWarehouse, InvInspect) UNION // 右外连接中仅InvInspect存在的部分 ( FILTER( InvInspect, NOT EXISTS( InvWarehouse, InvWarehouse[StockCode] = InvInspect[StockCode] && InvWarehouse[Warehouse] = InvInspect[Warehouse] ) ) ) - 创建最终内连接表:
Final_Query_Result = FILTER( NATURALINNERJOIN(FullJoin_InvWarehouse_InvInspect, InvMaster), NOT ISBLANK(InvInspect[StockCode]) )
内容的提问来源于stack exchange,提问作者Oleg Vovk
相关产品推荐
相关产品推荐

