在MS Reporting Services中执行动态子查询的最佳方法?
时间:2020-03-05 18:41:44 来源:igfitidea点击:
我是SQL Server Reporting Services的新手,并且想知道执行以下操作的最佳方法:
Query to get a list of popular IDs Subquery on each item to get properties from another table
理想情况下,最终报告列应如下所示:
[ID] [property1] [property2] [SELECT COUNT(*) FROM AnotherTable WHERE ForeignID=ID]
也许可以通过构造大型SQL查询来一次性完成所有操作的方法,但我希望将其分隔开。是否推荐编写一种VB函数以对每一行执行子查询的方法?谢谢你的帮助。
解决方案
回答
我建议使用SubReport。我们可以将SubReport放在表格单元格中。
回答
最简单的方法是这样的:
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
显然,这只是一个原始示例,适用标准规则,例如不要选择*等。
从08年8月21日在21:27更新:
@AlexCuse是的,完全同意表演。
我开始使用外部联接来编写它,但是随后在他的示例输出中看到了计数并认为这是他想要的,如果表是外部联接的,则计数将无法正确返回。更不用说联接会导致记录成倍增加(tbl1中的1个条目与tbl2中的2个条目相匹配= 2个返回),这可能是意料之外的。
因此,我想它真的可以归结为查询需要返回什么的细节。
从08年8月21日在22:07更新:
回答我们问题的其他部分是VB函数的路要走吗?不,绝对不会。不是为了这么简单的事情。
函数的性能很差,返回集中的每一行都执行该函数。
如果要"分隔"查询的不同部分,则必须像存储过程一样处理它。建立一个临时表,执行查询的一部分并将结果插入表中,然后执行所需的任何其他查询并更新原始临时表(或者插入更多临时表)。
回答
根据我们希望输出的外观,可以使用子报表,也可以对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我想在我们给出的示例中,我们会发现外部联接的性能要优于相关子查询。请记住,需要为每一行运行子查询。