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记录,
为什么会这样呢?
不是说连接时在笛卡尔积的基础上进行过滤的吗?那么两个查询返回的记录行数应该一致才对、
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记录,
为什么会这样呢?
不是说连接时在笛卡尔积的基础上进行过滤的吗?那么两个查询返回的记录行数应该一致才对、
left JOIN (先过滤那8条的语句)b
on a.empid=5
left JOIN Sales.Orders b
--on改为
on 1=1
where
a.empid=5
左边全部,右边符合条件所以你加上了WHERE a.empid <>5
是不一样的。没有where 是,HR.Employees 表所有的数据都出来
尤其注意left join 时条件放在on 后面跟放在where 后面是不一样的