SQL首先选择重复的结果

时间:2013-05-02 16:14:15

标签: sql-server tsql

您好我有一个查询,它返回带有相应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

是否可以只返回第一个“弗兰克计算机”行,并排除另一行?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

你的结果看起来很好:

avg

然而,为此选择IP是相当随意的(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] 将进行字母排序)。在SQL Server和Oracle中,您可以定义用户定义的聚合函数以更好地选择要显示的内容,在MySQL中,您可以使用min这样的内容,这可能完全符合您的需求。

答案 1 :(得分:0)

问题是你应该规定哪个"弗兰克的计算机"要包含的行。

"最小" IP?第一个插入?最后一个?

您可能希望使用GROUP BY子句,但需要确定要用于ip列的聚合类型。 MIN()MAX()

如果你只想要"首先"一个回归,这是巧合......你想把你的结果与页面上的数据顺序结合起来吗?

答案 2 :(得分:-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])