T-SQL左连接使用"或"操作者

时间:2015-04-23 20:06:29

标签: sql-server tsql left-join

我有以下查询,我想在匹配中拉入其中一个或两个。成员可以有多个ID或HIC。因此,如果member ID = member ID然后为最新的HIC拉出最大值(loaddate),同样如果HIC = HIC使用max(loaddate)拉入成员ID。我希望包含左连接,以防在任何一个场景中找不到匹配项。

代码:

 SELECT 
    CH1.*
    ,AVM.MBR_ID
    ,AVM.HIC
    ,AVM.MBR_LST_NM
    ,AVM.MBR_FST_NM
    ,CAST(AVM.MBR_BIRTH_DT AS DATE) AS 'MBR_BIRTH_DT'
    ,AVM.LOADDATE
FROM 
    #CHECK1 CH1
LEFT JOIN 
    AVRIL.DBO.VW_MBR AVM ON (CH1.HICN = AVM.HIC OR CH1.MEMBER_ID = AVM.MBR_ID)
WHERE 
    CH1.HEALTH_PLAN = 'AVRIL' 
    AND AVM.LOADDATE=(SELECT MAX(LOADDATE) FROM AVRIL.DBO.VW_MBR) 

谢谢, 迈克尔

2 个答案:

答案 0 :(得分:5)

当您使用VW_MBR子句中where表中的字段时,它会有效地将left join转换为inner join。将条件放在连接中:

...
FROM #CHECK1 CH1
    LEFT JOIN AVRIL.DBO.VW_MBR AVM ON (CH1.HICN = AVM.HIC OR CH1.MEMBER_ID = AVM.MBR_ID)
      AND AVM.LOADDATE=(SELECT MAX(LOADDATE) FROM AVRIL.DBO.VW_MBR)
WHERE CH1.HEALTH_PLAN = 'AVRIL' 

答案 1 :(得分:0)

这可能是第一个提议的答案的替代方案,我使用自定义查询作为关节来优化它(我只使用最大加载日期而不是在表的每一行上尝试关节)

SELECT CH1.*
    ,MAVM.MBR_ID
    ,MAVM.HIC
    ,MAVM.MAX_LOADDATE
FROM #CHECK1 CH1
LEFT JOIN (SELECT AVM.HIC
               ,AVM.MBR_ID
               MAX(AVM.LOADDATE) AS [MAX_LOADDATE]
           FROM AVRIL.DBO.VW_MBR AVM
           GROUP BY AVM.HIC, AVM.MBR_ID) MAVM (MAVM.HIC = CH1.HICN
                                                  OR MAVM.MBR_ID = CH1.MEMBER_ID)
WHERE CH1.HEALTH_PLAN = 'AVRIL' 

我简化了查询,专注于与其他提议查询相比的更改。您仍然可以向INNER JOIN添加AVRIL.DBO.VM_MBR子句,以获取更多列:

...
LEFT JOIN (...) MAVM ...
INNER JOIN AVRIL.DBO.VW_MBR AVM2 ON AVM2.HIC = MAVM.HIC
                                   AND AVM2.MBR_ID = MAVM.MBR_ID
                                   AND AVM2.LOADDATE = MAVM.MAX_LOADDATE
...

因此,您可以将AVM2.xxx用于您要使用的列。

希望这会有所帮助