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

多表LEFT JOIN SQL查询执行逻辑拆解及流程咨询

别担心,这完全是学习多表JOIN时非常常见的疑问,咱们一步步拆解,把它弄明白~

拆解你的多表LEFT JOIN查询

首先先把你的SQL语句清晰列出来,方便咱们逐部分分析:

SELECT * 
FROM Table1 
LEFT JOIN Table2 ON Table1.id = Table2.action_id 
LEFT JOIN Table3 ON Table1.changeset_id = Table3.id 
LEFT JOIN Table4 ON Table2.field_id = Table4.id

1. 逐个理解后续的LEFT JOIN

你已经搞懂第一个LEFT JOIN Table2的逻辑:保留Table1的所有行,匹配Table2中action_id等于Table1.id的行,匹配不到的话Table2的列会是NULL。后面两个LEFT JOIN都是基于前面已经生成的临时结果集来继续关联的,规则和第一个一致,但关联的对象和条件有区别:

第二个LEFT JOIN(关联Table3)

LEFT JOIN Table3 ON Table1.changeset_id = Table3.id

  • 这里是用原始Table1里的changeset_id字段去匹配Table3的主键id
  • 执行逻辑:保留前面临时结果集(Table1+Table2匹配后的所有行)的每一条记录,只要Table3里有id等于当前行changeset_id的记录,就把Table3的所有字段追加进来;如果找不到匹配的,Table3的所有字段都会显示为NULL
  • 划重点:这个关联和Table2有没有匹配到数据无关——哪怕某一行的Table2全是NULL,只要Table1的changeset_id能在Table3找到对应值,Table3的字段就会有内容

第三个LEFT JOIN(关联Table4)

LEFT JOIN Table4 ON Table2.field_id = Table4.id

  • 这里是用前面结果集中Table2的field_id字段去匹配Table4的主键id
  • 执行逻辑:保留前面临时结果集(Table1+Table2+Table3匹配后的所有行)的每一条记录:
    • 如果当前行的Table2.field_id有值(也就是之前Table2成功匹配到了数据),并且Table4里有id等于这个field_id的记录,就把Table4的字段追加进来;
    • 如果Table2.field_id是NULL(也就是Table2没匹配到数据),或者Table4里找不到对应的id,Table4的所有字段都会显示为NULL

2. 拆解整个执行的子流程

多表LEFT JOIN的执行顺序是从左到右逐步构建临时结果集,你可以把整个SQL拆成这三个递进的步骤:

  • 第一步:生成Table1 + Table2的临时结果集(记为Temp1)

    • 以Table1为基础表,把每一行和Table2中满足action_id = Table1.id的行进行匹配
    • 保留Table1的所有行,匹配到的Table2字段显示对应值,没匹配到的Table2字段全为NULL
  • 第二步:用Temp1关联Table3生成Temp2

    • 以Temp1为基础,把每一行和Table3中满足id = Temp1.changeset_id的行进行匹配
    • 保留Temp1的所有行,匹配到的Table3字段显示对应值,没匹配到的Table3字段全为NULL
  • 第三步:用Temp2关联Table4生成最终结果

    • 以Temp2为基础,把每一行和Table4中满足id = Temp2.field_id的行进行匹配
    • 保留Temp2的所有行,匹配到的Table4字段显示对应值,没匹配到的Table4字段全为NULL
    • 最后SELECT *就是把这个最终结果集的所有字段返回给你

3. 最终结果的核心特点

  • 结果集的行数和Table1的行数完全相同,因为所有JOIN都是LEFT JOIN,始终保留最左侧基础表(Table1)的每一行
  • Table2的字段:仅当Table1.id在Table2的action_id中存在时才有值,否则为NULL
  • Table3的字段:仅当Table1.changeset_id在Table3的id中存在时才有值,否则为NULL(和Table2是否匹配无关)
  • Table4的字段:仅当Table2成功匹配(field_id不为NULL)且该field_id在Table4的id中存在时才有值,否则为NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:42:57