SQLServer2005中的OUTER JOIN 和 INNER JOIN 精析(下)

(下)

下篇将以LEFT OUTER JOIN 操作为例,对SQLServer2005中内外连接的逻辑查询处理步骤进行详解

 

具体查询实例来自上篇(SQLServer2005中的OUTER JOIN 和 INNER JOIN 精析(上)):

select a.u_id,a.u_name,b.u_other
from table_one a LEFT OUTER JOIN table_two b
ON  a.u_id=b.u_id

 

步骤一:执行笛卡尔乘积(交叉连接)

对FROM 子句的前两个表执行笛卡尔乘积(交叉连接或未限定的链接),生成虚拟表VT1。VT1左表的行和右表的行的每一个可能的组合都包含一行。例如上篇实例中的左表包含3行,右表包含9行,VT1将包括3*9行。VT1中的列由该列的源表名限定(如果指定了别名则使用别名)。

根据实例查询语句:from table_one a...LEFT OUTER JOIN table_two b

你将得到如下表所示的虚拟表VT1(具体详细结果请参照上篇)

a.u_id    a.u_name   b.u_id   b.u_other

1             'AA'               1        'thanks a lot'

1             'AA'               1        'thanks a lot'

.                .                  .                 .

.                .                  .                 .

1             'AA'               66       'excellent'

 

2             'BB'              1        'thanks a lot'

2             'BB'              1        'thanks a lot'

.                .                 .                 .

.                .                 .                 .

2             'BB'              66       'excellent'

 

3             'CC'              1        'thanks a lot'

3             'CC'              1        'thanks a lot'

.                .                 .                 .

.                .                 .                 .

3             'CC'              66       'excellent'

 

步骤二:应用ON筛选器(连接条件)

ON筛选器是可以用于查询的三个筛选器(ON,WHERE,HAVING)中的第一个。ON筛选器中的逻辑表达式被应用到上一步返回的虚拟表(VT1)中的所有行。只有是(连接条件)为TRUE的那些行才会包含在由步骤2返回的虚拟表(VT2)中

根据实例查询语句:ON  a.u_id=b.u_id

步骤二返回的虚拟表VT2

Math?    a.u_id    a.u_name   b.u_id   b.u_other  

TRUE           1            'AA'             1      'very good'

TRUE           1            'AA'             1      'thanks a lot'

TRUE           1            'AA'             1      'thanks a lot'

TRUE           2            'BB'             2        NULL

TRUE           3            'CC'            3       'very good'

TRUE           3            'CC'            3       'thanks a lot'

 

步骤三:添加外部行(Outer Row)

这一步只与外部链接(outer join)有关。通过指定一种外部链接(LEFT,RIGHT或FULL),可以把一个或两个输入表标记为保留表。把一个表标记为保留表表示你希望返回该表的所有行,即使<连接条件>过滤掉了一些行。左外连接(left outer join) 把左表标记为保留表,右外连接(right outer join)把右表表示为保留表,完全外连接(full outer join)把两个表都标记为保留表。步骤3返回VT2中的行以及保留表在步骤2被过滤掉的行。保留表中的这些行被称为外部行。外部行中非保留表的属性被赋值为NULL。最后生成虚拟表VT3

在上面的实例中,保留表是table_one

语句:table_one a LEFT OUTER JOIN table_two b
只有table_one 中u_id为2的记录没有找到匹配项,因此u_id为2的记录被添加到上一步骤返回的虚拟表,b.u_other 的属性为NULL,生成虚拟表VT3,即得到最终的结果!

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值