我是 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 函数是正确的选择吗?不。绝对不。不是为了这么简单的事情。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top