一个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语句关联之后才会起作用,正如子陌所说,如果这里写错的话,结果一定会出错
------解决方案--------------------没错 我执行计划时 第一种查询的逻辑操作显示是 内连接,第二种是左外连接