在 MS Reporting Services 中执行动态子查询的最佳方法?
-
09-06-2019 - |
题
我是 SQL Server Reporting Services 的新手,想知道执行以下操作的最佳方法:
- 查询获取热门ID列表
- 对每个项目进行子查询以从另一个表获取属性
理想情况下,最终报告栏应如下所示:
[ID] [property1] [property2] [SELECT COUNT(*)
FROM AnotherTable
WHERE ForeignID=ID]
可能有多种方法可以构建一个巨大的 SQL 查询来一次性完成这一切,但我更愿意将其划分。推荐的方法是编写 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,我认为您会发现外连接比您给出的示例中的相关子查询性能更好。请记住,需要对每一行运行子查询。
最简单的方法是这样的:
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 函数是正确的选择吗?不。绝对不。不是为了这么简单的事情。
函数的性能非常糟糕,返回集中的每一行都会执行该函数。
如果您想“划分”查询的不同部分,则必须更像存储过程一样处理它。构建临时表,执行部分查询并将结果插入表中,然后执行所需的任何进一步查询并更新原始临时表(或插入更多临时表)。