一个LFET JOIN与INNER JOIN的问题
USE pubs
GO
--1.
SELECT *
FROM
dbo.sales AS A(NOLOCK)
LEFT JOIN
dbo.titles AS B(NOLOCK)
ON
A.title_id = B.title_id
WHERE
A.stor_id <> 6380
AND B.title <> 'Net Etiquette '
--2.
SELECT *
FROM
(SELECT * FROM dbo.sales(NOLOCK) WHERE stor_id <> 6380) AS A
LEFT JOIN
(SELECT * FROM dbo.titles(NOLOCK) WHERE title <> 'Net Etiquette ') AS B
ON
A.title_id = B.title_id
在执行计划里边查看的时候,
1.的显示结果是以inner join来执行的
2.的显示结果是以left join来执行的
请大家解析下为什么会出现这样的结果,解决后立刻揭贴
------解决方案--------------------把WHERE后的条件也揽入到ON后面:
SELECT *
FROM
dbo.sales AS A(NOLOCK)
LEFT JOIN
dbo.titles AS B(NOLOCK)
ON
A.title_id = B.title_id
AND
A.stor_id <> 6380
AND B.title <> 'Net Etiquette '
------解决方案--------------------因为用left join时,当右表找不到和左表匹配时,就有NULL值填充的,而你在WHERE后面有一句是针对右表的,这样会过虑掉所有NULL值,因此这时就失去了左连接的作用,和内连接是一样的,因此系统分析时用内连接了。
以上是我个人认为,勿见笑。
------解决方案--------------------统一楼上的。
去掉AND B.title <> 'Net Etiquette '则是用LEFT JOIN连接。
------解决方案--------------------楼主要理解Join关联与where条件的层次关系,也就是Where条件是在join语句关联之后才会起作用,正如子陌所说,如果这里写错的话,结果一定会出错
------解决方案--------------------没错 我执行计划时 第一种查询的逻辑操作显示是 内连接,第二种是左外连接