SQL Server多表连接查询问题:筛选组匹配的有效记录
解决多表查询的分组匹配与记录剔除问题
嘿,我来帮你搞定这个SQL查询的问题!首先咱们再明确下你的核心需求:
- 从表1(nevlista)中获取在表3(nkhk)指定日期范围内的用户记录
- 如果用户在表2(regikod)中有编码记录,必须保证表2的分组和表4(koltseghely)对应ktghelyID的分组一致
- 要剔除结果中csoport为F的那条记录
问题分析
你原查询里用了left outer join regikod,这意味着即使用户没有regikod记录,也会被保留。但如果直接把koltseghely.csoport = regikod.csoport放到where子句里,会导致那些没有regikod记录的用户(regikod.csoport为null)被过滤掉,这不符合你“保留无匹配条件记录”的需求。
修改后的查询代码
select nevlista.nevID, nevlista.nev, nkhk.ktghelyID, regikod.regikod, regikod.csoport from nevlista inner join nkhk on nevlista.nevID = nkhk.nevID left outer join regikod on nevlista.nevID = regikod.nevID and koltseghely.csoport = regikod.csoport -- 把分组匹配条件放到join的on子句中 inner join koltseghely on nkhk.ktghelyID = koltseghely.ktghelyID where nkhk.ktghelyID = 21 and nkhk.khkezddatum <= '2017-12-01' and (nkhk.khvegedatum is null or (nkhk.khvegedatum <= '2017-12-31' and not nkhk.khvegedatum <= '2017-12-01')) and (regikod.csoport is null or regikod.csoport != 'F') -- 剔除有regikod且csoport为F的记录
关键修改点说明
- 将分组匹配条件移至left join的on子句:
这样只有当用户存在regikod记录时,才会检查分组是否匹配;没有regikod记录的用户依然会被保留,完美符合你“满足特定匹配或无匹配条件”的要求。 - 添加剔除csoport为F的条件:
在where子句中加入(regikod.csoport is null or regikod.csoport != 'F'),这样既保留了无regikod记录的用户,又过滤掉了有regikod但分组为F的那条记录。
如果还有其他问题,随时提出来哦!
内容的提问来源于stack exchange,提问作者ajudi
相关产品推荐
相关产品推荐

