2016-01-06 10 views
0

Я пытаюсь вернуть строки, содержащие элементы из SCCM 2012, используя WQL (который по существу является SQL), и я получаю повторяющиеся строки в своих результатах, когда я модифицировал его, чтобы получить информацию из другой таблицы, используя внутреннее соединение (Изначально я не хотел иметь SMS_ObjectContainerItem.ContainerNodeID и просто использовал статью, где)Дублирующие результаты SQL Inner Join (SCCM 2012 WQL)

Вот код:

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, возвращает 55 результатов, однако полный запрос возвращает 84 результата, из которых все дополнительные функции просто дубликаты некоторых из предыдущих. Distinct не исправляет это, и я чувствую, что фактическое исправление будет переработкой предложения Inner Join/where, но мои SQL-навыки еще не установлены. Любая помощь будет оценена, чтобы удалить лишние строки, которые я получаю.

Спасибо.

Дополнительная информация, запрос не возвращает дубликатов, когда я делаю это, что является исходным запросом, который я написал, но теперь, когда я хочу сохранить, с какой 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 

EDITED: Обобщенные имена таблиц для облегчения чтения. Добавлен другой пример

+0

Когда у вас есть дубликаты, какие из них вам нужны? Примеры данных и желаемые результаты помогут прояснить, что вы действительно хотите сделать. –

ответ

1

Это не будет иметь дубликаты, но не является отличным решением, потому что он не решает логический вопрос у вас есть:

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 

Вы получаете дубликаты, потому что есть более чем одна строка в table2 для данного InstanceKey. Вместо этого вы хотите только присоединиться к одной строке в таблице2 для каждого экземпляра. В настоящее время все строки одинаковы в обеих строках, поэтому вы видите их как дубликаты. Если у вас есть уникальный ключ (в таблице 2) для присоединения к нему, у вас не будет проблемы с повторяющимися рядами.

+0

Это отличное решение, и я уверен, что это сработает для некоторых других случаев, но WQL фактически не поддерживает предложение GROUP BY. Интересно то, что без внутреннего соединения и удаления запроса для table2.containerNodeId этот код отлично работает и возвращает только ожидаемое количество результатов. – user2346731

+0

Хорошо, сделав это решением теперь, потому что вы были правы в таблице 2 с дубликатами (я до сих пор не понял причину этого, но я выяснил фильтр, который мне нужен, чтобы удалить лишние дубликаты. для ObjectType = '5000' для внешнего запроса, а также для внутреннего исправления. – user2346731

 Смежные вопросы

  • Нет связанных вопросов^_^