记一次SQL外连接and条件的误用
前段时间,在查找项目的一个BUG时发现该问题,为此特意整理该篇,以加深自己的印象,并给相关朋友一个注意和参考。
下面以一个小实例来讲该问题:
1、先建两张表并插入几条简单的测试数据,如下图
2、我们先看看左连接的结果(右连接类似,不再举例)
SELECT *
FROM Table1 left join Table2
on Table1.cc = Table2.cc
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'
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'
FROM Table1 left join Table2
on Table1.cc = Table2.cc
where Table1.cc = 'c2'
O(∩_∩)O哈!这个结果正是本来所期望的结果。因为如果将条件放到where子句 中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。

浙公网安备 33010602011771号