如何在两个表之间进行具有唯一结果的查询?

时间:2015-04-16 17:28:13

标签: sql sccm sccm-2007

我需要在SCCM 2012中进行查询以获取每个用户最后访问过的文件。我试图在sql中进行查询,但是我得到了很多重复的结果。

我需要的结果必须只包含每个用户的最后日期(最近一次)。

我使用的查询是:

SELECT     
  dbo.v_GS_SoftwareFile.FileName, 
  dbo.v_R_System.User_Name0, 
  dbo.v_GS_SoftwareFile.FileModifiedDate    
FROM 
  dbo.v_GS_SoftwareFile 
  CROSS JOIN dbo.v_R_System    
WHERE     
  (dbo.v_GS_SoftwareFile.FileName = N'outlook.exe') 
  AND (dbo.v_GS_SoftwareFile.FileModifiedDate > CONVERT(DATETIME, '2015-02-01 00:00:00', 102))    
GROUP BY 
  dbo.v_R_System.User_Name0, 
  dbo.v_GS_SoftwareFile.FileName, 
  dbo.v_GS_SoftwareFile.FileModifiedDate

我需要添加到此查询中吗?

1 个答案:

答案 0 :(得分:1)

您的CROSS JOIN可能对您报告的“重复结果”负责,因为您没有实际的连接条件(因此,如果一个表中有10条记录,另一条表中有100条记录,那么您将拥有10x100 = 1000条记录)。您的SoftwareFile和System表之间是否有公共密钥?

一旦您添加了JOIN条件,要将其缩小到每个用户的单个日期,请使用MAX()功能,如下所示:

SELECT     
      dbo.v_GS_SoftwareFile.FileName, 
      dbo.v_R_System.User_Name0, 
      MAX(dbo.v_GS_SoftwareFile.FileModifiedDate) AS LastFileModifiedDate    
FROM 
      dbo.v_GS_SoftwareFile 
       CROSS JOIN 
      dbo.v_R_System    
WHERE     
    (dbo.v_GS_SoftwareFile.FileName = N'outlook.exe') 
    AND (dbo.v_GS_SoftwareFile.FileModifiedDate > CONVERT(DATETIME, '2015-02-01 00:00:00', 102))    
GROUP BY 
      dbo.v_R_System.User_Name0, 
      dbo.v_GS_SoftwareFile.FileName