Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 左联接上的内部联接使左联接的行为与内部联接相同_Sql_Sql Server 2005_Join - Fatal编程技术网

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有什么不同吗?只是出于好奇。。。