Sql 左联接上的内部联接使左联接的行为与内部联接相同
我有两个查找表,我想内部连接彼此,但我只想左连接我的数据表Sql 左联接上的内部联接使左联接的行为与内部联接相同,sql,sql-server-2005,join,Sql,Sql Server 2005,Join,我有两个查找表,我想内部连接彼此,但我只想左连接我的数据表 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 an
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\u TYPES\u FileRecordID=ENTRY\u TYPE
失败,我不希望ENTRY
记录作为连接到客户端的左连接项可用
上面代码的编写方式条目上的左连接的行为类似于内部连接。我自己解决了这个问题,我需要将内部连接作为子查询分离出来
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'
您自己已经找到了一个解决方案,但现在您将其作为子查询。您还可以通过在原始查询中移动一些部分并添加两个括号来实现这一点
因此,这只是为了展示一个替代方案:
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'
如果您修改内部联接
以允许条目
中的值为NULL
的可能性,并且在中
不再将其打断,则一切都会好起来。或者在第一次之后继续使用LEFT-OUTER-JOIN
s,因为这是您真正想要的。有趣的是,这是修改了SQL的执行计划还是仅仅是语义上的差异?通过两种方式测试,我所做的版本比原来的版本好1%(根据Management Studio生成的“Acutal执行计划”)。你的版本有一个嵌套循环(左外连接)
我的版本有一个合并连接(左外连接)
,我认为这弥补了差异。这很有趣。谢谢分享结果。你手头也有探查器吗?读/CPU有什么不同吗?只是出于好奇。。。