【问题标题】:Inner join on a left join makes the left join behave as a inner join左连接上的内连接使左连接表现为内连接
【发布时间】:2013-01-30 16:21:13
【问题描述】:

我有两个查找表,我想将它们内部连接在一起,但是我只想在我的数据表上进行左连接。

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 上的左连接的编写方式类似于内连接。

【问题讨论】:

  • 如果您修改INNER JOIN 以允许ENTRY 中的NULL 值的可能性,并且您不会在WHERE 中再次破坏它,一切都会好起来的。或者在第一次之后继续使用LEFT OUTER JOINs,因为那是你真正想要的。

标签: sql sql-server-2005 join


【解决方案1】:

您自己已经找到了解决方案,但现在您将其设为子查询。您也可以通过在原始查询中移动一些部分并添加两个括号来做到这一点。

所以这只是为了展示一个替代方案:

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'

【讨论】:

  • 有意思,这是修改了SQL的执行计划还是只是语义上的不同?
  • 两种方式测试,我做的版本好1%(根据Management Studio生成的“实际执行计划”)。你的版本有一个Nested Loop (Left Outer Join),而我的版本有一个Merge Join (Left Outer Join),我认为这弥补了差异。
  • 这很有趣。谢谢分享结果。你手边也有分析器吗?读取/CPU有什么区别吗?只是出于好奇...
【解决方案2】:

在我输入问题时我自己想通了,我需要将内部联接分离为子查询

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2017-08-15
    • 2010-10-06
    • 2015-03-04
    相关资源
    最近更新 更多