SQL Server:查询以比较单个表中的记录并返回不匹配的记录

时间:2013-08-08 09:47:58

标签: sql-server compare records

我目前正在使用SSIS查询数据库,并且每晚将同一查询中的记录返回到另一个带有日期戳的数据库中的表中。我希望能够使用SSRS / SQL查询来比较昨天的记录和今天从查询返回的记录,并返回任何不匹配的记录。

这包括:

  • 新增内容(新行)
  • 新删除(昨天有的行,今天不在这里)
  • 昨天和今天之间可能已更改的任何列

表格中的数据示例如下:

SERVERNAME    CPUs    RAM    DISK    DATE  
==========    ====    ===    ====    ====  
Server1        1       2      20     8/8/2013  
Server2        2       4      40     8/8/2013  
Server3        2       4      40     8/8/2013  
Server1        1       2      20     9/8/2013  
Server3        2       6      40     9/8/2013  

查询比较差异会返回(或任何类似的) - 我甚至不介意返回3个表来满足添加/删除/更改:

SERVERNAME    CPUs    RAM    DISK    DATE  
==========    ====    ===    ====    ====  
Server2        2       4      40     8/8/2013  
NULL           NULL    NULL   NULL   9/8/2013  
Server3        2       4      40     8/8/2013  
Server3        2       6      40     9/8/2013  

非常感谢任何帮助!

这是我的第一篇文章,如果格式化搞砸了就道歉......

2 个答案:

答案 0 :(得分:1)

假设每个日期没有重复的服务器名称,您可以尝试以下方法:

WITH allservers AS (
  SELECT DISTINCT SERVERNAME AS GroupingName
  FROM YourTable
  WHERE DATE IN (@yesterday, @today)
)
SELECT s.GroupingName, x.*
FROM allservers AS s
LEFT JOIN YourTable AS y ON s.GroupingName = y.SERVERNAME AND y.DATE = @yesterday
LEFT JOIN YourTable AS t ON s.GroupingName = t.SERVERNAME AND t.DATE = @today
CROSS APPLY (
  SELECT @yesterday AS GroupingDate, y.*
  UNION ALL
  SELECT @today     AS GroupingDate, t.*
) x
WHERE EXISTS (
  SELECT y.CPUs, y.RAM, y.DISK
  EXCEPT
  SELECT t.CPUs, t.RAM, t.DISK
)
ORDER BY s.GroupingName, x.GroupingDate;

此查询生成的输出与您的输出完全不匹配,但可以在主SELECT子句中轻松调整。添加的两列{%1}和GroupingName的主要目的是将相关行保持在一起并按特定顺序排列(昨天的行后跟今天的行)。

您可以使用查询at SQL Fiddle的实时演示。

答案 1 :(得分:0)

您可以使用EXCEPT and INTERSECT t-sql命令查找行集之间的差异

以下是使用它的示例:

declare @foo as table (foo int)
declare @foo2 as table (foo int)

insert into @foo values(1),(2),(5)
insert into @foo2 values(1),(2),(4)

select * from @foo
union
select * from @foo2
except
select * from @foo
intersect
select * from @foo2

此查询将在第一个表中找到第二个表中不存在的所有记录 以及第二个表中存在但在第一个表中不存在的所有记录 (它的工作方式类似于“NOT INTERSECT”)