在 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
我正在尝试在 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