SQL如何处理wrapped joins(嵌套连接)及两种连接写法的差异
两种SQL写法的差异分析
核心结论
这两种写法在所有符合SQL标准的数据库中执行逻辑、返回结果完全等价,不存在任何差异,只是写法上显式加括号/隐式按优先级执行的区别。
逻辑拆解对比
第一种带显式括号的写法执行顺序
FROM (A INNER JOIN (B LEFT JOIN C ON B.ID2 = C.ID2) ON A.ID1= B.ID1)
- 优先执行最内层括号的
B LEFT JOIN C ON B.ID2 = C.ID2,得到的中间结果集包含B表的全部记录,能匹配上C表的行对应C字段填充值,匹配不到的C字段全部为NULL - 再执行外层的
A INNER JOIN 第一步的中间结果 ON A.ID1 = B.ID1,仅保留A、B两表ID1匹配的行,C字段的空值/非空值状态和第一步结果完全一致
第二种无显式括号的写法执行顺序
FROM A INNER JOIN B ON A.ID1 = B.ID1 LEFT JOIN C on B.ID2 = C.ID2
SQL的JOIN运算默认满足左结合规则,且优先级从左到右生效,所以不加括号时会默认按照左到右的顺序执行,和第一种写法的括号划分逻辑等价:
- 先执行
A INNER JOIN B ON A.ID1 = B.ID1,得到A、B两表ID1匹配的全部记录 - 再拿上述中间结果执行
LEFT JOIN C ON B.ID2 = C.ID2,给所有匹配的B记录关联对应的C表数据,匹配不到的C字段为NULL,最终结果和第一种写法完全一致
补充说明
只有当LEFT JOIN的关联条件涉及A表的字段、或者括号调整了LEFT JOIN的作用范围时,不同括号的写法才会出现结果差异,你当前给出的两个查询中JOIN的关联条件完全独立,不会有任何执行差异。
内容的提问来源于stack exchange,提问作者Steven Thi
相关产品推荐
相关产品推荐

