日期:2014-05-18  浏览次数:20502 次

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