来自 SQL 内部联接 (SCCM 2012 WQL) 的重复结果
Duplicate results from SQL Inner Join (SCCM 2012 WQL)
我正在尝试 return 使用 WQL(本质上是 SQL)包含来自 SCCM 2012 的项目的行,并且当我修改它以从中提取信息时,我的结果中出现了重复的行另一个 table 使用内部连接(最初我不关心 SMS_ObjectContainerItem.ContainerNodeID 并且只是使用 where 子句)
代码如下:
SELECT DISTINCT table1.Name, table1.CollectionID, table2.ContainerNodeID
FROM table1
INNER JOIN table2 ON table1.CollectionID = table2.InstanceKey
WHERE table1.CollectionID IN
(
SELECT DISTINCT InstanceKey
FROM table2
WHERE ObjectType='5000' AND (ContainerNodeID=16777279 OR ContainerNodeID=16777220)
) AND CollectionType='2'
ORDER BY table1.Name
我要注意的一件事是,提供外部 WHERE 子句的内部查询 returns 55 个结果,但是完整查询 returns 84 个结果,其中所有额外内容只是之前一些内容的重复。 Distinct 没有解决这个问题,我感觉真正的解决方法是对内部 Join/where 子句进行修改,但我的 SQL 技能还不具备。任何帮助删除我得到的额外行将不胜感激。
谢谢。
更多信息,当我执行此操作时,查询 return 没有重复项,这是我编写的原始查询,但现在我想保留该行来自哪个 ContainerNodeID,显示了额外的行。
SELECT DISTINCT table1.Name, table1.CollectionID
FROM table1
WHERE table1.CollectionID IN
(
SELECT DISTINCT InstanceKey
FROM table2
WHERE ObjectType='5000' AND (ContainerNodeID=16777279 OR ContainerNodeID=16777220)
) AND CollectionType='2'
ORDER BY table1.Name
已编辑:广义 table 名称以方便阅读。添加了其他示例
这不会有重复,但不是一个很好的解决方案,因为它没有解决您遇到的逻辑问题:
SELECT table1.Name, table1.CollectionID, table2.ContainerNodeID
FROM table1
INNER JOIN table2 ON table1.CollectionID = table2.InstanceKey
WHERE table1.CollectionID IN
(
SELECT DISTINCT InstanceKey
FROM table2
WHERE ObjectType='5000' AND (ContainerNodeID=16777279 OR ContainerNodeID=16777220)
) AND CollectionType='2'
ORDER BY table1.Name
GROUP BY table1.Name, table1.CollectionID, table2.ContainerNodeID
您得到了重复项,因为对于给定的 InstanceKey,table2 中有不止一行。相反,您想要的是一种只为每个 instancekey 连接到 table2 中的一行的方法,当前所有行在两行中都是相同的,因此您将其视为重复项。如果您有一个唯一键(在表 2 中)可以加入,那么您就不会有重复行问题。
我正在尝试 return 使用 WQL(本质上是 SQL)包含来自 SCCM 2012 的项目的行,并且当我修改它以从中提取信息时,我的结果中出现了重复的行另一个 table 使用内部连接(最初我不关心 SMS_ObjectContainerItem.ContainerNodeID 并且只是使用 where 子句)
代码如下:
SELECT DISTINCT table1.Name, table1.CollectionID, table2.ContainerNodeID
FROM table1
INNER JOIN table2 ON table1.CollectionID = table2.InstanceKey
WHERE table1.CollectionID IN
(
SELECT DISTINCT InstanceKey
FROM table2
WHERE ObjectType='5000' AND (ContainerNodeID=16777279 OR ContainerNodeID=16777220)
) AND CollectionType='2'
ORDER BY table1.Name
我要注意的一件事是,提供外部 WHERE 子句的内部查询 returns 55 个结果,但是完整查询 returns 84 个结果,其中所有额外内容只是之前一些内容的重复。 Distinct 没有解决这个问题,我感觉真正的解决方法是对内部 Join/where 子句进行修改,但我的 SQL 技能还不具备。任何帮助删除我得到的额外行将不胜感激。
谢谢。
更多信息,当我执行此操作时,查询 return 没有重复项,这是我编写的原始查询,但现在我想保留该行来自哪个 ContainerNodeID,显示了额外的行。
SELECT DISTINCT table1.Name, table1.CollectionID
FROM table1
WHERE table1.CollectionID IN
(
SELECT DISTINCT InstanceKey
FROM table2
WHERE ObjectType='5000' AND (ContainerNodeID=16777279 OR ContainerNodeID=16777220)
) AND CollectionType='2'
ORDER BY table1.Name
已编辑:广义 table 名称以方便阅读。添加了其他示例
这不会有重复,但不是一个很好的解决方案,因为它没有解决您遇到的逻辑问题:
SELECT table1.Name, table1.CollectionID, table2.ContainerNodeID
FROM table1
INNER JOIN table2 ON table1.CollectionID = table2.InstanceKey
WHERE table1.CollectionID IN
(
SELECT DISTINCT InstanceKey
FROM table2
WHERE ObjectType='5000' AND (ContainerNodeID=16777279 OR ContainerNodeID=16777220)
) AND CollectionType='2'
ORDER BY table1.Name
GROUP BY table1.Name, table1.CollectionID, table2.ContainerNodeID
您得到了重复项,因为对于给定的 InstanceKey,table2 中有不止一行。相反,您想要的是一种只为每个 instancekey 连接到 table2 中的一行的方法,当前所有行在两行中都是相同的,因此您将其视为重复项。如果您有一个唯一键(在表 2 中)可以加入,那么您就不会有重复行问题。