You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

具体执行步骤:

  1. 全外连接生成中间表:
    将InvWarehouse和InvInspect通过StockCode+Warehouse组合字段做全外连接,得到包含三类记录的中间数据集:
    • 两张表中完全匹配的记录(所有字段均有值)
    • 仅存在于InvWarehouse的记录(InvInspect侧所有字段为NULL)
    • 仅存在于InvInspect的记录(InvWarehouse侧所有字段为NULL)
  2. 内连接过滤结果:
    用上述中间表与InvMaster执行内连接,连接条件为InvInspect.StockCode = InvMaster.StockCode。由于内连接要求连接字段不能为NULL,因此步骤1中仅存在于InvWarehouse的记录(此时InvInspect.StockCode为NULL)会被直接过滤,最终结果等价于InvWarehouse与InvInspect先做右外连接,再和InvMaster内连接。

PowerBI与SQL结果差异的常见原因

  1. 连接顺序差异:PowerQuery/DAX的默认连接逻辑可能和SQL的执行顺序不一致,比如DAX可能先处理InvInspect与InvMaster的内连接,再和InvWarehouse做全外连接,导致结果偏差
  2. NULL值处理逻辑:SQL与PowerBI对NULL值的匹配规则存在细节差异,全外连接后NULL字段的处理方式不同
  3. 字段大小写敏感性:SQL Server默认不区分字段大小写,但PowerBI对大小写敏感,若连接字段大小写不统一会导致匹配失败

PowerBI重构方案

PowerQuery实现(严格遵循SQL逻辑)

  1. 导入三张原始表到PowerQuery
  2. 先执行InvWarehouse与InvInspect的全外连接:
    • 选中InvWarehouse表,点击「合并查询」→ 选择InvInspect表,连接字段勾选StockCode和Warehouse,连接类型选择「全外部」
  3. 再执行中间表与InvMaster的内连接:
    • 选中合并后的中间表,点击「合并查询」→ 选择InvMaster表,连接字段选择InvInspect.StockCode和InvMaster.StockCode,连接类型选择「内部」
  4. 展开需要输出的字段,确保和SQL查询的字段一致

DAX实现(模拟SQL执行顺序)

由于DAX没有原生全外连接函数,需手动模拟:

  1. 创建全外连接中间表:
    FullJoin_InvWarehouse_InvInspect = 
    // 左外连接部分
    NATURALLEFTOUTERJOIN(InvWarehouse, InvInspect)
    UNION
    // 右外连接中仅InvInspect存在的部分
    (
        FILTER(
            InvInspect,
            NOT EXISTS(
                InvWarehouse,
                InvWarehouse[StockCode] = InvInspect[StockCode] && InvWarehouse[Warehouse] = InvInspect[Warehouse]
            )
        )
    )
    
  2. 创建最终内连接表:
    Final_Query_Result = 
    FILTER(
        NATURALINNERJOIN(FullJoin_InvWarehouse_InvInspect, InvMaster),
        NOT ISBLANK(InvInspect[StockCode])
    )
    

内容的提问来源于stack exchange,提问作者Oleg Vovk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:30:19