Sql server 使用“或”运算符的T-SQL左联接

Sql server 使用“或”运算符的T-SQL左联接,sql-server,tsql,left-join,Sql Server,Tsql,Left Join,我有下面的问题,我想在比赛中拉一个或两个。一个成员可以有多个ID或HIC。因此,如果成员ID=成员ID,则拉取最新HIC的最大加载日期。同样,如果HIC=HIC,则拉取具有最大加载日期的成员ID。我想包括左连接,以防两种情况下都找不到匹配项 代码: 谢谢, Michael当您在where子句中使用VW_MBR表中的字段时,它会有效地将左连接转换为内部连接。将条件放入联接中: ... FROM #CHECK1 CH1 LEFT JOIN AVRIL.DBO.VW_MBR AVM ON (C

我有下面的问题,我想在比赛中拉一个或两个。一个成员可以有多个ID或HIC。因此,如果成员ID=成员ID,则拉取最新HIC的最大加载日期。同样,如果HIC=HIC,则拉取具有最大加载日期的成员ID。我想包括左连接,以防两种情况下都找不到匹配项

代码:

谢谢,
Michael

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

...
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' 

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

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' 
我简化了查询,将重点放在与其他建议查询相比的更改上。您仍然可以向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


希望这会有所帮助

这不会得出正确的结果。它省略了原始check1表中的几条记录。很简单,在过去的几个小时里,我一直在为此痛打自己。谢谢@Michael-虽然为了清楚起见,条件实际上属于ON子句,但另一种方法是重写WHERE子句以允许null:WHERE。。并且AVM.LOADDATE为NULL或AVM.LOADDATE=选择。这样,不匹配的行仍将包括在内。@Michael如果这是答案,那么您应该给它检查谢谢您的帮助,现在我确定了我应该包括的其他内容。因此,HIC和成员ID之间的maxloaddate可能不同。因此,如果CH1.HICN=AVM.HIC的最大日期为2015年4月23日,而CH1.Member_ID=AVM.MBR_ID的最大日期为2015年4月24日,会发生什么情况?这不会拉,对吗?我正在接收来自左连接的所有结果,但没有可以归因于上述场景的一些匹配。这可能有些过分,但我只是将该数据发送到另一个临时表,然后运行此代码,它给了我所需的结果。选择CH2.*在CHECK2 CH2的CHECK3中,通过[ENG ID]MAXLD从CHECK2 GROUP中选择MAXLOADDATE作为MAX_LOADDATE,其中MAXLD.[ENG ID]=CH2.[ENG ID]和MAXLD.MAX_LOADDATE=CH2.LOADDATE
...
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
...