MSSQL多表左连接查询:保留所有符合条件的GROUPS记录
解决Azure MSSQL中保留所有符合条件Groups记录的关联查询问题
问题出在你使用了**内连接(JOIN)**关联Contacts表,这会自动过滤掉没有匹配到符合条件联系人的Groups记录——哪怕前面用了LEFT JOIN GroupContacts,内连接的逻辑仍会把无对应联系人的结果排除。
以下是两种正确的写法:
写法一:将Contacts关联改为LEFT JOIN并在ON子句中过滤条件
SELECT G.GroupID, GC.ContactID, C.ContactID, C.Status, C.Type FROM Groups G LEFT JOIN GroupContacts GC ON GC.GroupID = G.GroupID LEFT JOIN Contacts C ON C.ContactID = GC.ContactID AND C.Type = 'Manager' AND C.Status = 'Active' WHERE G.Status = 'Active' AND G.Type = 'Physician'
写法二:先过滤Contacts表再关联(性能更优)
如果Contacts表数据量较大,先过滤出符合条件的联系人再进行关联,能减少关联的数据量:
SELECT G.GroupID, GC.ContactID, C.ContactID, C.Status, C.Type FROM Groups G LEFT JOIN GroupContacts GC ON GC.GroupID = G.GroupID LEFT JOIN ( SELECT ContactID, Status, Type FROM Contacts WHERE Type = 'Manager' AND Status = 'Active' ) C ON C.ContactID = GC.ContactID WHERE G.Status = 'Active' AND G.Type = 'Physician'
这两种写法都会保留所有满足G.Status='Active' AND G.Type='Physician'的Groups记录,当没有匹配到符合条件的联系人时,Contacts相关字段会显示NULL,最终得到预期的1951条结果。
内容的提问来源于stack exchange,提问作者PaulC
相关产品推荐
相关产品推荐

