2016-12-29 104 views
-1

我有这个查询将列出没有安装一个软件的所有服务器,但问题是它返回多个资产ID。 我希望它只是每个资产ID返回一个结果。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; 

我在这里看到类似的问题,并试图实施的建议,但似乎无法得到它的工作。

编辑

道歉不包括此早些时候,不能正确格式化:

下面是结果的样本是我得到:

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 

我每个资产ID都会得到多个结果,我只想得到一个结果。

+3

添加示例数据和预期输出。 –

+3

请发布示例数据,预期结果,以及您尝试过的操作。请点击此处查看以改进问题:https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question -on-a-public-forum/ – TheGameiswar

+1

逻辑上,你的连接是1:M关系;因此,如果'Select distinct top X' ... ...没有工作,那么您选择的值是使记录唯一并且因此导致assetID被“重复”的原因。你可以选择不是assetID的每个值的max(),而是那些你想从其他表中得到的值?什么决定了每个AssetID的tsysOS,tblSoftwareUni,tblSoftware的价值? – 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