在 WHERE 子句中产生 AND 的 WQL 查询?

WQL query that results in an AND in the WHERE clause?

我正在尝试在 SCCM 中创建一个基于查询的集合,该集合将针对所有装有四个特定程序的计算机。这四个程序也可以安装在与我尝试定位的应用程序无关的计算机上,因此该集合不应包括这些程序。只有安装了所有 4 个程序的 PC 才应包含在集合中。

下面的简单实现不起作用,但这是我想要的逻辑:

SELECT SMS_R_SYSTEM.Name
FROM SMS_R_System
    INNER JOIN SMS_G_System_ADD_REMOVE_PROGRAMS
        ON SMS_G_System_ADD_REMOVE_PROGRAMS.ResourceID = SMS_R_System.ResourceId
    INNER JOIN SMS_G_System_ADD_REMOVE_PROGRAMS_64
        ON SMS_G_System_ADD_REMOVE_PROGRAMS_64.ResourceID = SMS_R_System.ResourceId
WHERE SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName LIKE "ArcGIS Engine%" AND
      SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName LIKE "Java 8%" AND
      SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName LIKE "Microsoft SQL Server%" AND
      SMS_G_System_ADD_REMOVE_PROGRAMS_64.DisplayName = "SQL Server Management Studio"

你如何在此处获得合乎逻辑的 AND

请注意,SCCM 的接口需要 WQL,而不是 T-SQL 用于集合查询。因此,COUNT 运算符不可用(我相信 HAVING 子句的工作方式不同)。

这不是最好的方法,但这对您来说很容易调试。您可以多次加入同一个 table,您只需要每次给它不同的别名,这些加入中的每一个都可以用于过滤特定的程序:

SELECT S.Name
FROM SMS_R_System s
INNER JOIN SMS_G_System_ADD_REMOVE_PROGRAMS p1
    On p1.ResourceID = S.ResourceId
INNER JOIN SMS_G_System_ADD_REMOVE_PROGRAMS p2
    On p2.ResourceID = S.ResourceId
INNER JOIN SMS_G_System_ADD_REMOVE_PROGRAMS p3
    On p3.ResourceID = S.ResourceId
INNER JOIN SMS_G_System_ADD_REMOVE_PROGRAMS p4
    On p4.ResourceID = S.ResourceId
WHERE p1.DisplayName LIKE 'ArcGIS Engine%'
AND P2.DisplayName LIKE 'Java 8%'
AND p3.DisplayName LIKE 'Microsoft SQL Server%'
AND p4.DisplayName = 'SQL Server Management Studio'

您可以使用 4 个 EXISTS 子句来查找每个单独的程序。该解决方案与 Andrew 发布的解决方案基本相同。

或者,您可以使用这样的东西:

SELECT SMS_R_SYSTEM.Name
FROM SMS_R_System 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 LIKE "ArcGIS Engine%" OR
      SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName LIKE "Java 8%" OR
      SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName LIKE "Microsoft SQL Server%" OR
      SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName = "SQL Server Management Studio"
GROUP BY SMS_R_SYSTEM.Name
HAVING COUNT(DISTINCT SMS_G_System_ADD_REMOVE_PROGRAMS.DisplayName) = 4