2013-02-14 188 views
0

我有两个查找表,我想要彼此内连接,但是我只想在我的数据表上留下连接。左连接上的内部连接使左连接表现为内连接

select * from CLIENT 
LEFT JOIN [ENTRY] 
    on [ENTRY].ENTRY_CODE = CLIENT.CLIENT_COUNTY 
    and [ENTRY].ENTRY_RECD = 'A' 
INNER JOIN [ENTRY_TYPES] 
    on [ENTRY_TYPES].ENTRY_TYPES_FileRecordID = [ENTRY].ENTRY_TYPE 
    and [ENTRY_TYPES].ENTRY_TYPES_CODE = 'COUNTY' 
    and [ENTRY_TYPES].ENTRY_TYPES_RECD = 'A' 
    where CLIENT_RECD = 'A' 

所以,如果ENTRY_TYPES_FileRecordID = ENTRY_TYPE失败,我不希望这样ENTRY记录可作为左连接件的连接上CLIENT

上述代码写入ENTRY上的左连接的方式表现得像内连接。

+0

如果修改了'INNER JOIN'允许从''ENTRY'值NULL'的可能性,并且没有再次打破它'WHERE',一切都会好的。或者在第一个之后继续使用'LEFT OUTER JOIN',因为这是你真正想要的。 – HABO 2013-02-14 20:08:25

回答

0

想通了我自己,因为我是打字的问题,我需要分离出内部联接为一个子查询

select * from CLIENT 
left join 
(
    select ENTRY_CODE, ENTRY_NAME 
    from [ENTRY] 
    inner join [ENTRY_TYPES] on ENTRY_TYPES_FileRecordID = ENTRY_TABLE 
          and ENTRY_TYPES_CODE = 'COUNTY' 
          and ENTRY_TYPES_RECD = 'A' 
    where ENTRY_RECD = 'A' 
) as CountyLookup on CLIENT_COUNTY = ENTRY_CODE 
where CLIENT_RECD = 'A' 
0

你已经自己找到了一个解决方案,但现在你来了一个子查询。您也可以通过在原始查询中移动一些部分并添加两个括号来完成此操作。

所以这只是表明一种替代方案:

SELECT * 
FROM [CLIENT] 
LEFT JOIN ([ENTRY] --opening bracket 
     INNER JOIN [ENTRY_TYPES] 
      ON [ENTRY_TYPES].[ENTRY_TYPES_FileRecordID] = [ENTRY].[ENTRY_TYPE] 
       AND [ENTRY_TYPES].[ENTRY_TYPES_CODE] = 'COUNTY' 
       AND [ENTRY_TYPES].[ENTRY_TYPES_RECD] = 'A') -- closing bracket 
    ON [ENTRY].[ENTRY_CODE] = [CLIENT].[CLIENT_COUNTY] 
     AND [ENTRY].[ENTRY_RECD] = 'A' 
WHERE [CLIENT_RECD] = 'A' 
+0

有趣的是,这是否修改了SQL的执行计划,或者这仅仅是一种语义差异? – 2013-02-14 20:37:13

+0

通过两种方式测试,我所做的版本比1%更好(根据Management Studio生成的“Acutal Execution Plan”)。你的版本有一个'嵌套循环(左外部连接)',我在那里做了一个'合并连接(左外连接)',我认为它们有所不同。 – 2013-02-14 20:43:21

+0

这很有趣。感谢分享结果。你还有手头的分析器吗?读/ CPU有什么不同?出于好奇... – Jacco 2013-02-14 20:47:16