如何在不使用WHERE子句的情况下编写该T-SQL JOIN查询?
解决方案
要实现你需要的结果集且不使用WHERE子句,关键是把所有过滤逻辑整合到JOIN的ON条件中,同时选择合适的JOIN类型来避免多余的行。具体来说:
- 使用INNER JOIN而非LEFT JOIN:因为你只需要关联存在对应实例(#TblA)的版本记录,LEFT JOIN会引入#TblB中无匹配实例的行(对应#TblA字段为NULL),这不是你想要的。
- 在
ON条件中同时指定两个核心规则:- 关联相同
SQLVersion的行(确保只比较同版本的构建号) - 确保#TblB的
ProductVersion高于#TblA的对应值
- 关联相同
最终查询代码
SELECT a.SQLInstance, a.SQLVersion, a.ProductVersion AS CurrentBuild, b.ProductVersion AS AvailableHigherBuild FROM #tblA a INNER JOIN #tblB b ON a.SQLVersion = b.SQLVersion AND b.ProductVersion > a.ProductVersion ORDER BY a.SQLVersion, a.SQLInstance, b.ProductVersion DESC
代码说明
- 字段别名:给
a.ProductVersion和b.ProductVersion加上别名(CurrentBuild和AvailableHigherBuild),让结果集更清晰,符合报表需求。 - 排序:添加
ORDER BY子句让结果按版本、实例、可用版本从高到低排序,方便分组报表展示。 - 无WHERE子句:所有过滤逻辑都在
ON条件中完成,完全符合你的要求。
验证结果
比如对于MyServer1(SQL Server 2016,13.0.4001.0),结果会列出#TblB中所有13.0.4001.0以上的SQL Server 2016构建号,每一行重复显示MyServer1的信息,正好满足分组报表的需求。
内容的提问来源于stack exchange,提问作者Clive
相关产品推荐
相关产品推荐

