T-SQL Left Join 使用 "or" 运算符
T-SQL Left Join using "or" operator
我有以下查询,我想在比赛中加入其中一个或两个。一名会员可以有多个 ID 或 HIC。因此,如果 member ID = member ID
然后拉取最新 HIC 的最大 (loaddate) 同样,如果 HIC = HIC
拉入具有最大 (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)
谢谢,
迈克尔
当您在 where
子句中使用 VW_MBR
table 中的字段时,它有效地将 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'
这可能是第一个建议答案的替代方案,我使用自定义查询作为连接以优化它(我只使用最大加载日期而不是在 [= 的每一行上尝试连接23=]).
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
作为您要使用的列。
希望这会有所帮助
我有以下查询,我想在比赛中加入其中一个或两个。一名会员可以有多个 ID 或 HIC。因此,如果 member ID = member ID
然后拉取最新 HIC 的最大 (loaddate) 同样,如果 HIC = HIC
拉入具有最大 (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)
谢谢, 迈克尔
当您在 where
子句中使用 VW_MBR
table 中的字段时,它有效地将 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'
这可能是第一个建议答案的替代方案,我使用自定义查询作为连接以优化它(我只使用最大加载日期而不是在 [= 的每一行上尝试连接23=]).
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
作为您要使用的列。
希望这会有所帮助