【问题标题】:Comparing two datasets SQL SSRS 2005比较两个数据集 SQL SSRS 2005
【发布时间】:2012-07-13 15:17:41
【问题描述】:

我在两个单独的服务器上有两个数据集。他们都提取一列信息。

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

根据我的阅读,我似乎想在 SQL 端执行此操作,而不是在报告端;我不知道该怎么做。

如果有人能阐明这是怎么可能的,我将不胜感激。

【问题讨论】:

    标签: sql reporting-services reportingservices-2005


    【解决方案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
        )
    

    【讨论】:

    • 问题在于它们不仅仅是不同的表。它们完全是不同的数据库和服务器。我不知道如何在一个 SQL 调用中连接到多个服务器。
    • 如果它们都是 SQL Server 实例,您可以创建一个Linked Server,以便跨服务器查询/比较这两个表。
    • 这就是我要找的。谢谢。我刚刚创建了链接服务器,当它询问链接服务器名称时,它使用了 IP(它询问了我用来在网络上引用它的名称)会弄乱我的 sql 调用吗?我可以像这样使用它:[xxx.xxx.x.xxx].db.schema.table 吗?
    【解决方案2】:

    您也可以使用左连接:

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

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

    【讨论】:

      【解决方案3】:

      如果您希望行恰好出现在一个数据集中,并且每个表都有一个匹配的键,那么您可以使用完全外连接:

      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。如果您有一个复合键,您只需替换为指定两个表之间匹配的列列表。

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 2021-04-15
        • 1970-01-01
        • 2011-07-30
        • 2015-07-10
        • 2014-08-30
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        相关资源
        最近更新 更多