0

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

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

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

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

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

4

3 回答 3

2

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

于 2008-08-21T19:28:49.757 回答
0

最简单的方法是这样的:

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 函数是要走的路吗?不,绝对不是。不是为了这么简单的事情。

函数的性能很差,返回集中的每一行都执行函数。

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

于 2008-08-21T19:35:07.777 回答
0

根据您希望输出的外观,可以使用子报表,或者您可以对 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我认为您会发现外部联接比您给出的示例中的相关子查询表现更好。请记住,需要为每一行运行子查询。

于 2008-08-21T20:11:36.720 回答