从具有内部联接的表中选择不同的行

时间:2014-02-13 13:01:06

标签: sql distinct

您好我正在尝试构建一个目前看起来像这样的查询:

  SELECT DISTINCT cit.ComputerName
    FROM ComputerInvTracking cit
         INNER JOIN (
               SELECT ComputerName, 
                      DATEDIFF(day, time, GetDate()) AS time,
                      REPLACE(REPLACE(room, ',OU=Rooms,OU=Computers,OU=student,DC=campus,DC=ads,DC=uwe,DC=ac,DC=uk',''), 'OU=CL_','') AS room
                 FROM ComputerInvTracking cit2
         )
               ON cit.ComputerName = cit2.ComputerName
ORDER BY cit2.time

目前抱怨近端括号附近出现语法错误。 我正在使用SQL服务器

我完全陷入困境。有任何想法吗?

2 个答案:

答案 0 :(得分:3)

您需要子查询上的表别名。所有subquerys都需要有名字:

SELECT DISTINCT cit.ComputerName
FROM ComputerInvTracking cit INNER JOIN
     (SELECT ComputerName, DATEDIFF(day, time, GetDate()) AS time, REPLACE(REPLACE(room, ',OU=Rooms,OU=Computers,OU=student,DC=campus,DC=ads,DC=uwe,DC=ac,DC=uk',''), 'OU=CL_','') AS room
      FROM  ComputerInvTracking cit2
     ) cit2
     --^
     ON cit.ComputerName = cit2.ComputerName
ORDER BY cit2.time

答案 1 :(得分:0)

正如Gordon Linoff所说,你需要为你的子查询添加别名。这是您当前遇到的语法错误的原因。

查看您的查询,您似乎正在尝试获取ComputerName中的所有唯一ComputerInvTracking,然后跟踪其历史记录。我认为你的查询是向后的,并且实际上想要在子查询中(或在公用表表达式中)进行“唯一的ComputerName”过滤。

您的查询现在的工作方式,您将首先为每台计算机获取NxN行(其中N是该计算机ComputerInvTracking的{​​{1}}表中的条目数),然后过滤掉重复。这是额外的工作,它会在一天内多次删除同一台计算机在同一房间内的行,因为这会在查询中显示为重复的行。

我会推荐类似以下的内容:

ComputerName