Sql 组合查询(WQL子选择查询-Powershell-SCCM)

Sql 组合查询(WQL子选择查询-Powershell-SCCM),sql,powershell,sccm,wql,Sql,Powershell,Sccm,Wql,现在我正在使用两个不同的查询并比较结果对象,但是我更希望使用一个唯一的查询来完成所有需要的操作,因为我希望直接在SCCM中使用它,而不仅仅是PowerShell (第一个查询为所有安装了特定x64软件的计算机创建一个对象,第二个查询为所有未安装特定x86软件的计算机创建一个查询) 比较这两个对象,我可以得到我需要的列表(两个对象中都有哪些机器) 但是,如何将这两个查询组合在一起,使其成为一体 例如: 所有有SMS\u G\u系统\u添加\u删除\u程序\u 64.DisplayName=“SOF

现在我正在使用两个不同的查询并比较结果对象,但是我更希望使用一个唯一的查询来完成所有需要的操作,因为我希望直接在SCCM中使用它,而不仅仅是PowerShell

(第一个查询为所有安装了特定x64软件的计算机创建一个对象,第二个查询为所有未安装特定x86软件的计算机创建一个查询)

比较这两个对象,我可以得到我需要的列表(两个对象中都有哪些机器)

但是,如何将这两个查询组合在一起,使其成为一体

例如:

所有有SMS\u G\u系统\u添加\u删除\u程序\u 64.DisplayName=“SOFTWARE1”和没有SMS\u G\u系统\u添加\u删除\u程序的计算机。DisplayName=“SOFTWARE2”


似乎您可以只包含所有连接,然后将where语句与
组合。您必须调整
select
语句以包含您关心的列

$query = @"

select *  from  SMS_R_System 
inner join SMS_G_System_ADD_REMOVE_PROGRAMS_64 
on SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceId = SMS_R_System.ResourceId 
inner join SMS_G_System_COMPUTER_SYSTEM 
on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId 
where (SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "SOFTWARE1")
and (SMS_G_System_COMPUTER_SYSTEM.Name 
not in (select distinct SMS_G_System_COMPUTER_SYSTEM.Name 
       from  SMS_R_System
       inner join SMS_G_System_COMPUTER_SYSTEM
       on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId
       inner join SMS_G_System_ADD_REMOVE_PROGRAMS
       on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId
       where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "SOFTWARE2" ))

"@

似乎您可以只包含所有连接,然后将where语句与
组合。您必须调整
select
语句以包含您关心的列

$query = @"

select *  from  SMS_R_System 
inner join SMS_G_System_ADD_REMOVE_PROGRAMS_64 
on SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceId = SMS_R_System.ResourceId 
inner join SMS_G_System_COMPUTER_SYSTEM 
on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId 
where (SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "SOFTWARE1")
and (SMS_G_System_COMPUTER_SYSTEM.Name 
not in (select distinct SMS_G_System_COMPUTER_SYSTEM.Name 
       from  SMS_R_System
       inner join SMS_G_System_COMPUTER_SYSTEM
       on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId
       inner join SMS_G_System_ADD_REMOVE_PROGRAMS
       on SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId
       where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "SOFTWARE2" ))

"@

似乎没有必要使用SMS系统计算机系统类。下面是一个简单的WQL版本,它应该满足您的需求

select SMS_R_System.Name 
from SMS_R_System 
where SMS_R_System.ResourceID in 
(select SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceID 
from SMS_G_System_ADD_REMOVE_PROGRAMS_64 
where SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "SOFTWARE1") 
and SMS_R_System.ResourceID not in 
(select SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID 
from SMS_G_System_ADD_REMOVE_PROGRAMS 
where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "SOFTWARE2")
希望我的回答能对您有所帮助,并期待您的反馈

致以最良好的祝愿,
Ray

似乎没有必要使用SMS\u G\u系统\u计算机\u系统类。下面是一个简单的WQL版本,它应该满足您的需求

select SMS_R_System.Name 
from SMS_R_System 
where SMS_R_System.ResourceID in 
(select SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceID 
from SMS_G_System_ADD_REMOVE_PROGRAMS_64 
where SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "SOFTWARE1") 
and SMS_R_System.ResourceID not in 
(select SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID 
from SMS_G_System_ADD_REMOVE_PROGRAMS 
where SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "SOFTWARE2")
希望我的回答能对您有所帮助,并期待您的反馈

致以最良好的祝愿,
Ray

这很好用,我只需要扩展sms\u g\u系统\u计算机\u系统,就可以得到实际的机器名。从中学到了很多,谢谢!这很好用,我只需要扩展sms_g_系统_计算机_系统就可以得到实际的机器名。从中学到了很多,谢谢!太好了,这是最好的质量。比我所拥有的要简单得多,多亏了这一点,我学到了很多!干杯。关于我如何在这方面做得更好,有什么建议吗?不知何故,每次我处理这些问题时,他们都会觉得非常复杂。太好了,这是最高质量的。比我所拥有的要简单得多,多亏了这一点,我学到了很多!干杯。关于我如何在这方面做得更好,有什么建议吗?不知何故,每次我提出这些问题时,他们都觉得很复杂。