0

您好,我有一个查询返回计算机名称及其相应的 IP 地址,如下所示:

SELECT DISTINCT TOP (100) PERCENT dbo.Inv_AeX_AC_TCPIP.[IP Address],
                                  dbo.Inv_AeX_AC_TCPIP.[Host Name]
FROM dbo.Inv_AeX_AC_Identification
INNER JOIN dbo.Inv_AeX_AC_TCPIP 
   ON dbo.Inv_AeX_AC_Identification._ResourceGuid = dbo.Inv_AeX_AC_TCPIP._ResourceGuid

这将返回结果,例如:

Computer:               IP: 

Frank's Computer        10.0.0.1
Frank's Computer        10.0.0.3
Nick's Computer         10.0.1.0

是否可以只返回第一个“弗兰克的电脑”行,而排除另一行?

谢谢!

4

3 回答 3

2

是的,这是可能的,但如何取决于您选择的 DBMS。您正在寻找的功能是GROUP BY,它将相似的结果放在同一列中,但显然它确实需要知道如何处理非聚合值,方法是将它们放在聚合函数中,如max,minavg

你的结果看起来像这样:

SELECT min(dbo.Inv_AeX_AC_TCPIP.[IP Address]) AS IP, dbo.Inv_AeX_AC_TCPIP.[Host Name] AS Name
FROM dbo.Inv_AeX_AC_Identification
INNER JOIN dbo.Inv_AeX_AC_TCPIP 
   ON dbo.Inv_AeX_AC_Identification._ResourceGuid = dbo.Inv_AeX_AC_TCPIP._ResourceGuid
GROUP BY dbo.Inv_AeX_AC_TCPIP.[Host Name]

然而,IP 的选择现在相当随意(min将按字母排序)。在 SQL Server 和 Oracle 中,您可以定义用户定义的聚合函数来更好地选择要显示的内容,在 MySQL 中,您可以使用group_concat可能完全适合您的需求的东西。

于 2013-05-02T16:21:55.983 回答
0

问题是你应该规定哪个“Frank's Computer”行。

具有“最低”IP 的那个?第一个插入?最后一个?

您可能想要使用GROUP BY子句,但需要决定对 ip 列使用哪种聚合。MIN(),MAX() ?

如果您只想要返回中的“第一个”,那很巧合......您是否要将结果与页面上的数据顺序结合起来?

于 2013-05-02T17:05:40.170 回答
-2
    SELECT DISTINCT dbo.Inv_AeX_AC_TCPIP.[IP Address], dbo.Inv_AeX_AC_TCPIP.[Host Name]
FROM         dbo.Inv_AeX_AC_Identification INNER JOIN  dbo.Inv_AeX_AC_TCPIP ON                                              dbo.Inv_AeX_AC_Identification._ResourceGuid = dbo.Inv_AeX_AC_TCPIP._ResourceGuid
and dbo.Inv_AeX_AC_TCPIP.[Host Name] in (select top 1 dbo.Inv_AeX_AC_TCPIP from dbo.Inv_AeX_AC_Identification 
    INNER JOIN  dbo.Inv_AeX_AC_TCPIP T ON dbo.Inv_AeX_AC_Identification._ResourceGuid = T._ResourceGuid and T.[IP Address] = dbo.Inv_AeX_AC_TCPIP.[IP Address])
于 2013-05-02T16:20:50.783 回答