比较两个数据集SQL SSRS 2005

时间:2012-07-13 15:17:42

标签: sql reporting-services reportingservices-2005

我在两个单独的服务器上有两个数据集。他们都分别拉出一列信息。

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

从我读过的内容来看,似乎我想在SQL端做这个,而不是报告端;我不知道该怎么做。

如果有人能够了解可能性如何,我会非常感激。

3 个答案:

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

答案 1 :(得分:1)

您也可以使用左连接:

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

此查询将返回tableA中没有tableB中相应记录的所有记录。

答案 2 :(得分: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.如果你有一个复合键,你只需要用指定两个表之间匹配的列表替换。