日期:2014-05-17  浏览次数:20459 次

左连接查询的谓词条件过滤问题
SELECT * from HR.Employees
CROSS JOIN Sales.Orders
WHERE Employees.empid=5
ORDER BY Employees.empid
返回830行记录。

SELECT * from HR.Employees a
left JOIN Sales.Orders b
on a.empid=5
返回了838行记录。
SELECT * from HR.Employees a
left JOIN Sales.Orders b
on a.empid=5
WHERE a.empid <>5
ORDER BY a.empid
查询看了下,多出来的8行记录是,左连接添加orders记录的null记录,
为什么会这样呢?
不是说连接时在笛卡尔积的基础上进行过滤的吗?那么两个查询返回的记录行数应该一致才对、

------解决方案--------------------
这个和查询顺序有关,先ON再where

------解决方案--------------------
SELECT * from HR.Employees a
left JOIN (先过滤那8条的语句)b
on a.empid=5
------解决方案--------------------
SELECT * from HR.Employees a
left JOIN Sales.Orders b
--on改为
on 1=1
where
 a.empid=5
------解决方案--------------------
这个跟sql语句的执行顺序有关

在不加WHERE Employees.empid=5,这个条件的情况下,结果是一样的

参考:http://www.cnblogs.com/summer_adai/archive/2011/10/28/2227605.html
------解决方案--------------------
left join 是什么连接?
左边全部,右边符合条件

所以你加上了WHERE a.empid <>5
是不一样的。

没有where 是,HR.Employees 表所有的数据都出来
------解决方案--------------------
建议楼主看一下inner join 、left join 、right join相关的书吧
尤其注意left join 时条件放在on 后面跟放在where 后面是不一样的