2012-07-13 223 views
1

我在两个单独的服务器上有两个数据集。他们每人都拉一列信息。比较两个数据集SQL SSRS 2005

我想创建一个报告,显示只出现在其中一个数据集中的行的值。

从我读过的东西看来,我想在SQL方面而不是报告方面做到这一点;我不知道该怎么做。

如果有人能够阐明如何做到这一点,我会非常感激。

回答

1

您可以使用NOT EXISTS子句获得两个表之间的差异。

SELECT 
    Column 
FROM 
    DatabaseName.SchemaName.Table1 
WHERE 
    NOT EXISTS 
    (
     SELECT 
      Column 
     FROM 
      LinkedServerName.DatabaseName.SchemaName.Table2 
     WHERE 
      Table1.Column = Table2.Column --looks at equalities, and doesn't 
              --include them because of the 
              --NOT EXISTS clause 
    ) 

这将显示在Table1没有出现在Table2行。您可以反转表名以查找Table2中未出现在Table1中的行。

编辑:进行编辑以显示连接的服务器的情况。另外,如果您想要查看两个表中不共享的所有行,则可以尝试下面的方法。

SELECT 
    Column, 'Table1' TableName 
FROM 
    DatabaseName.SchemaName.Table1 
WHERE 
    NOT EXISTS 
    (
     SELECT 
      Column 
     FROM 
      LinkedServerName.DatabaseName.SchemaName.Table2 
     WHERE 
      Table1.Column = Table2.Column --looks at equalities, and doesn't 
              --include them because of the 
              --NOT EXISTS clause 
    ) 

UNION 

SELECT 
    Column, 'Table2' TableName 
FROM 
    LinkedServerName.DatabaseName.SchemaName.Table2 
WHERE 
    NOT EXISTS 
    (
     SELECT 
      Column 
     FROM 
      DatabaseName.SchemaName.Table1 
     WHERE 
      Table1.Column = Table2.Column 
    ) 
+0

问题是他们不只是不同的表。它们完全是不同的数据库和服务器。我不知道如何在一次SQL调用中连接到多个服务器。 – 2012-07-13 15:24:53

+2

如果它们都是SQL Server实例,则可以创建一个[Linked Server](http://msdn.microsoft.com/zh-cn/library/ms188279.aspx),这将允许您跨查询/比较两个表服务器。 – 2012-07-13 15:26:24

+0

这就是我一直在寻找的。谢谢。我只是做了链接服务器,当它询问链接的服务器名称时,它使用IP(它询问我在网络上引用它的名称)是否会搅乱我的SQL调用?我可以像这样使用它:[xxx.xxx.x.xxx] .db.schema。表? – 2012-07-13 15:46:11

1

您还可以使用左连接:

select a.* from tableA a 
    left join tableB b 
    on a.PrimaryKey = b.ForeignKey 
where b.ForeignKey is null 

这个查询从没有TableB中相应的记录表A返回的所有记录。

1

如果您想要出现在只有一个数据集的行,你必须对每个表的匹配关键字,那么你可以使用一个完全外部联接:

select * 
from table1 t1 full outer join 
    table2 t2 
    on t1.key = t2.key 
where t1.key is null and t2.key is not null or 
     t1.key is not null and t2.key is null 

WHERE条件选择的行,其中只有一个比赛。

虽然这个查询的问题是,你会得到大量带有空值的列。一种解决这个问题的方法是在SELECT子句中逐一查看列。

select coalesce(t1.key, t2.key) as key, . . . 

解决此问题的另一种方法是使用带有窗口函数的联合。该版本汇集了所有的行和统计看来,关键的次数:

select t.* 
from (select t.*, count(*) over (partition by key) as keycnt 
     from ((select 'Table1' as which, t.* 
      from table1 t 
      ) union all 
      (select 'Table2' as which, t.* 
      from table2 t 
      ) 
      ) t 
    ) t 
where keycnt = 1 

这样做的价值来源于其表的附加列指定。它还有一个额外的列keycnt,其值为1.如果您有组合键,则只需使用指定两个表之间匹配的列列表进行替换即可。