如何用SMS SQL查询同时安装多个KB热修复补丁的设备?
解决SCCM中查询同时安装多个KB补丁的机器问题
嘿,你那个直接用逗号分隔多个KB号的写法是行不通的——SQL语法里不支持这种格式,会直接报语法错误。而且就算改成IN ('KB123','KB124','KB125'),那也只能找出安装了其中任意一个补丁的机器,完全不是你要的「同时安装所有指定补丁」的场景。
下面给你两种可行的方案,根据你的实际需求选就行:
方案一:多次内连接(适合补丁数量少的情况)
这种方法逻辑直白,每一个KB补丁都和系统表做一次内连接,只有同时满足所有连接条件的机器才会被选中:
select SMS_R_SYSTEM.ResourceID, SMS_R_SYSTEM.ResourceType, SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier, SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_QUICK_FIX_ENGINEERING qfe1 on qfe1.ResourceId = SMS_R_System.ResourceId and qfe1.HotFixID = 'KB123' inner join SMS_G_System_QUICK_FIX_ENGINEERING qfe2 on qfe2.ResourceId = SMS_R_System.ResourceId and qfe2.HotFixID = 'KB124' inner join SMS_G_System_QUICK_FIX_ENGINEERING qfe3 on qfe3.ResourceId = SMS_R_System.ResourceId and qfe3.HotFixID = 'KB125'
简单说就是:只有当某台机器在qfe1里有KB123的记录、qfe2里有KB124的记录、qfe3里有KB125的记录时,才会被筛选出来,完美匹配「同时安装多个补丁」的需求。
方案二:GROUP BY + HAVING(适合补丁数量多的情况)
如果以后要查的补丁数量很多,多次写JOIN会很繁琐,这种分组统计的方法扩展性更好:
select SMS_R_SYSTEM.ResourceID, SMS_R_SYSTEM.ResourceType, SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier, SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_QUICK_FIX_ENGINEERING on SMS_G_System_QUICK_FIX_ENGINEERING.ResourceId = SMS_R_System.ResourceId where SMS_G_System_QUICK_FIX_ENGINEERING.HotFixID in ('KB123','KB124','KB125') group by SMS_R_SYSTEM.ResourceID, SMS_R_SYSTEM.ResourceType, SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier, SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client having count(distinct SMS_G_System_QUICK_FIX_ENGINEERING.HotFixID) = 3
思路是:先把所有安装了指定补丁中任意一个的机器捞出来,然后按机器的唯一标识分组,统计每个机器匹配到的不同补丁数量。只有数量等于你指定的补丁总数(这里是3)的机器,才说明所有补丁都安装了。以后要加补丁的话,只要修改IN里的列表,同时把HAVING后面的数字改成对应的数量就行。
小提示
记得把SQL里的双引号改成单引号哦,虽然部分数据库支持双引号,但单引号是SQL的标准写法,兼容性更好。
内容的提问来源于stack exchange,提问作者Fitz
相关产品推荐
相关产品推荐

