【问题标题】:Best way to perform dynamic subquery in MS Reporting Services?在 MS Reporting Services 中执行动态子查询的最佳方式?
【发布时间】:2010-09-06 11:01:15
【问题描述】:

我是 SQL Server Reporting Services 的新手,想知道执行以下操作的最佳方法:

  • 查询以获取热门 ID 列表
  • 对每个项目进行子查询以从另一个表中获取属性

理想情况下,最终报告列应如下所示:

[ID] [property1] [property2] [SELECT COUNT(*)
                              FROM AnotherTable 
                              WHERE ForeignID=ID]

可能有一些方法可以构建一个巨大的 SQL 查询来一次性完成所有这些,但我更喜欢将它划分。是否推荐编写一个 VB 函数来为每一行执行子查询?感谢您的帮助。

【问题讨论】:

    标签: sql sql-server reporting-services service reporting


    【解决方案1】:

    我建议使用SubReport。您可以将 SubReport 放在表格单元格中。

    【讨论】:

      【解决方案2】:

      根据您希望输出的外观,可以使用子报表,或者您可以对 ID、property1、property2 进行分组并将其他表中的项目显示为详细项目(假设您想要显示的不仅仅是计数) .

      有点像

      select t1.ID, t1.property1, t1.property2, t2.somecol, t2.someothercol
      from table t1 left join anothertable t2 on t1.ID = t2.ID
      

      @Carlton Jenke 我认为您会发现外连接比您给出的示例中的相关子查询性能更好。请记住,需要为每一行运行子查询。

      【讨论】:

        【解决方案3】:

        最简单的方法是这样的:

        select *,
         (select count(*) from tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
        from tbl1 t1
        

        这是一个可行的版本(使用表变量):

        declare @tbl1 table
        (
         tbl1ID int,
         prop1 varchar(1),
         prop2 varchar(2)
        )
        
        declare @tbl2 table
        (
         tbl2ID int,
         tbl1ID int
        )
        
        select *,
         (select count(*) from @tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
        from @tbl1 t1
        

        显然这只是一个原始示例 - 标准规则适用,例如不选择 * 等...


        2008 年 8 月 21 日 21:27 更新:
        @AlexCuse - 是的,完全同意表现。

        我开始使用外连接来编写它,但后来在他的示例输出中看到计数并认为这就是他想要的,如果表是外连接的,计数将不会正确返回。更不用说连接会导致您的记录成倍增加(tbl1 中的 1 个条目匹配 tbl2 中的 2 个条目 = 2 返回),这可能是意外的。

        所以我想这真的归结为您的查询需要返回的细节。


        2008 年 8 月 21 日 22:07 更新:
        要回答您问题的其他部分- VB 函数是要走的路吗?不,绝对不是。不是为了这么简单的事情。

        函数在性能上非常糟糕,返回集中的每一行都执行该函数。

        如果您想“划分”查询的不同部分,您必须更像一个存储过程来处理它。构建一个临时表,执行部分查询并将结果插入表中,然后执行您需要的任何进一步查询并更新原始临时表(或插入更多临时表)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-18
          • 2017-05-28
          • 2011-02-26
          • 1970-01-01
          相关资源
          最近更新 更多