SQL多表混合连接逻辑疑问:内连接与左连接组合执行规则
链式左连接与混合连接规则解析
你之前在Oracle中使用的旧式多表连接语法:
select * from Table_a a, Table_b b, Table_c c where a.id = b.id and b.thing = c.thing
等价于SQL Server中的多表内连接。针对你提到的两个显式连接疑问,解析如下:
1. 全左连接语句的执行逻辑
select * from Table_a a left join Table_b b on a.id = b.id left join Table_c c on b.thing = c.thing
- 会保留Table_a的所有记录:无论Table_b中是否存在匹配
a.id的记录,Table_a的行都会被保留;若Table_b无匹配,b的所有字段返回NULL。 - Table_c是基于前一步左连接的结果集(Table_a左连Table_b后的临时表)进行左连接:由于连接条件是
b.thing = c.thing,如果b的记录为NULL(即Table_a无匹配的Table_b记录),b.thing也是NULL,而NULL与任何值比较都不相等,此时Table_c的所有字段也会返回NULL;只有当b有有效记录且C存在匹配的thing值时,C才会显示对应数据。
简单来说:链式左连接是按顺序逐步执行的,每一步都基于前面所有连接后的结果集操作。
2. 混合连接语句的执行逻辑
select * from Table_a a join Table_b b on a.id = b.id left join Table_c c on b.thing = c.thing
- Table_c是左连接到Table_a与Table_b内连接后的结果集,而非单独的Table_b或Table_a。
- 执行顺序:
- 先执行Table_a和Table_b的内连接,只保留两者
id匹配的记录(过滤掉A或B中无匹配的行); - 再用这个内连接的结果左连Table_c,保留内连接的所有记录;若Table_c中无匹配
b.thing的记录,c的所有字段返回NULL。
- 先执行Table_a和Table_b的内连接,只保留两者
核心规则:显式连接的执行顺序严格遵循书写顺序,每一步连接的对象都是前面所有连接操作生成的中间结果集,而非原始表。
内容的提问来源于stack exchange,提问作者user25774566
相关产品推荐
相关产品推荐

