记一次SQL外连接and条件的误用

前段时间,在查找项目的一个BUG时发现该问题,为此特意整理该篇,以加深自己的印象,并给相关朋友一个注意和参考。

 

 

下面以一个小实例来讲该问题:

 

1、先建两张表并插入几条简单的测试数据,如下图

 

2、我们先看看左连接的结果(右连接类似,不再举例)

SELECT * 
FROM Table1 left join Table2
on Table1.cc = Table2.cc

 

这个结果,没什么好多说的,不管连接字段是否为null,table1中所有数据行全部包含。

 

3、我们再在左连接的基础上,再用and接个条件看看

SELECT * 
FROM Table1 left join Table2
on Table1.cc = Table2.cc
and Table1.cc = 'c2'

 

 

看到这个结果,有些朋友就会有些意外了,本人要说的这个BUG正是这个and条件误用导致。

本来期望的结果是只有第二条结果,可是却出现了3条。

查找了下相关资料:当把条件加入到 join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。也就是在原来数据行不变的情况下,and条件是对第二个表的数据行进行了筛选。

 

4、最后我们看看在左连接的基础上,用where接条件的情况

 

SELECT * 
FROM Table1 left join Table2
on Table1.cc = Table2.cc
where Table1.cc = 'c2'

 

 

O(∩_∩)O哈!这个结果正是本来所期望的结果。因为如果将条件放到where子句 中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。

posted @ 2010-05-05 10:58  rob_2010  阅读(190)  评论(0)    收藏  举报