2016-12-29 2 views
-1

У меня есть этот запрос, в котором будут перечислены все серверы без установленного программного обеспечения, однако проблема в том, что он возвращает более одного идентификатора актива. Я хочу, чтобы он просто возвращал один результат за идентификатор объекта.SQL-запрос - возвращает один результат на ID

Я пытался использовать DISTINCT, но не могу понять это правильно. Он возвращает тысячи, а не несколько сотен строк.

Вот SQL:

Select Top 1000000 tblAssets.AssetID, 
    tblAssets.AssetUnique, 
    tblAssets.Domain, 
    tblAssets.Username, 
    tblSoftwareUni.softwareName As software, 
    tblSoftware.softwareVersion As version, 
    tblSoftwareUni.SoftwarePublisher As publisher, 
    tsysOS.OSname As OS, 
    tsysOS.Image As icon 

From tblSoftware 
    Inner Join tblAssets On tblSoftware.AssetID = tblAssets.AssetID 
    Inner Join tblSoftwareUni On tblSoftware.softID = tblSoftwareUni.SoftID 
    Inner Join tblAssetCustom On tblAssets.AssetID = tblAssetCustom.AssetID 
    Inner Join tsysOS On tblAssets.OScode = tsysOS.OScode 

Where tblSoftwareUni.softwareName Not Like 'Hawkeye G Host Sensor%' And 
    tblAssetCustom.State = 1 
    AND tsysOS.OSname Not Like 'Win 7' 
    AND tsysOS.OSname Not Like 'Win 10' 
    AND tsysOS.OSname Not Like 'Win 8.1' 
    AND tsysOS.OSname Not Like 'Win XP' 
    AND tsysOS.OSname Not Like 'Win 8' 

Order By AssetID Asc; 

Я видел подобные вопросы здесь и попытался реализовать предложения, но не может заставить его работать.

EDIT

Извиняюсь за не включая это раньше, не может отформатировать его надлежащим образом:

Вот пример результатов, которые я получаю:

AssetID AssetUnique Domain Username software version publisher OS icon 
3133 COMPUTERNAME DOMAIN Administrator Realtek High Definition Audio Driver 5.10.0.5404 Realtek Semiconductor Corp. Win 2003 R2 win200310.png 
3133 COMPUTERNAME DOMAIN Administrator Certero AssetStudio Client 3.2.0 Certero Win 2003 R2 win200310.png 
3133 COMPUTERNAME DOMAIN Administrator Intel(R) PRO Network Connections 12.1.12.0 12.1 Intel Win 2003 R2 win200310.png 
3133 COMPUTERNAME DOMAIN Administrator Certero AssetStudio 5.0 Client 5.0.703.20109 Certero Win 2003 R2 win200310.png 
3133 COMPUTERNAME DOMAIN Administrator LiveReg (Symantec Corporation) 2.4.2.2295 Symantec Corporation Win 2003 R2 win200310.png 
3133 COMPUTERNAME DOMAIN Administrator MopUPS Express   Win 2003 R2 win200310.png 
3133 COMPUTERNAME DOMAIN Administrator Sophos AutoUpdate 5.2.0.276 Sophos Limited Win 2003 R2 win200310.png 
3133 COMPUTERNAME DOMAIN Administrator MSXML 6 Service Pack 2 (KB954459) 6.20.1099.0 Microsoft Corporation Win 2003 R2 win200310.png 
3133 COMPUTERNAME DOMAIN Administrator Snow Inventory Client for Windows (x86) 3.7.04 Snow Software AB Win 2003 R2 win200310.png 

I Я получаю несколько результатов за идентификатор объекта, если мне нужен только один результат.

+3

Добавить пример данных и ожидаемый результат. –

+3

, пожалуйста, отправьте образцы данных, ожидаемый результат, а также то, что вы пробовали. Пожалуйста, проверьте здесь, чтобы улучшить вопрос: https: //spaghettidba.com/2015/04/24/how-to-post-at-sql-question -on-a-public-forum/ – TheGameiswar

+1

Логически ваши соединения - отношения 1: M; Поэтому, если 'Select different top X' ... не работает, то выбранные вами значения - это то, что делает запись уникальной, и для чего происходит активация свойстваIDID« Duplicated ». Вы можете выбрать max() для каждого значения, а не id, но действительно ли это значения из других таблиц? Что определяет значение от tsysOS, tblSoftwareUni, tblSoftware для каждого AssetID? – xQbert

ответ

1

ROW_NUMBER Использование функции окна

select * from 
(
select row_number()over(partition by tblAssets.AssetID order by (select NULL)) Rn, 
     ... 
from your query 
) A 
Where RN = 1 

Заменить (select NULL) в Order by если у вас есть какой-либо другой столбец для заказа результата и принести первый или последний.

Теперь результат будет произвольным, различные записи могут быть выбраны для каждого AssetID

0

Использования ROW_NUMBER() Функции, чтобы получить отчетливые строки на AssetID. Что-то вроде ....

SELECT Top 1000000 * 
FROM (
Select tblAssets.AssetID, 
    tblAssets.AssetUnique, 
    tblAssets.Domain, 
    tblAssets.Username, 
    tblSoftwareUni.softwareName As software, 
    tblSoftware.softwareVersion As version, 
    tblSoftwareUni.SoftwarePublisher As publisher, 
    tsysOS.OSname As OS, 
    tsysOS.Image As icon, 
    ROW_NUMBER() OVER (PARTITION BY tblAssets.AssetID ORDER BY tblAssets.AssetID)rn 

From tblSoftware 
    Inner Join tblAssets On tblSoftware.AssetID = tblAssets.AssetID 
    Inner Join tblSoftwareUni On tblSoftware.softID = tblSoftwareUni.SoftID 
    Inner Join tblAssetCustom On tblAssets.AssetID = tblAssetCustom.AssetID 
    Inner Join tsysOS On tblAssets.OScode = tsysOS.OScode 

Where tblSoftwareUni.softwareName Not Like 'Hawkeye G Host Sensor%' And 
    tblAssetCustom.State = 1 
    AND tsysOS.OSname Not Like 'Win 7' 
    AND tsysOS.OSname Not Like 'Win 10' 
    AND tsysOS.OSname Not Like 'Win 8.1' 
    AND tsysOS.OSname Not Like 'Win XP' 
    AND tsysOS.OSname Not Like 'Win 8' 
)A 
WHERE rn = 1 
Order By AssetID Asc 
Смежные вопросы