【问题标题】:Combine data from several queries合并来自多个查询的数据
【发布时间】:2014-06-18 12:41:50
【问题描述】:

我们正在寻找一种更强大的方式来收集和处理要在我们的报告中处理的数据。对于一个大型数据库的高级报告,我们需要运行两个独立的 SQL 查询(在同一个数据源上),然后将它们组合起来。

查询1返回:

user id#1 ... 3 columns
user id#2 ... 3 columns
user id#4 ... 3 columns

查询 2 返回:

user id#1 ... 5 columns
user id#3 ..  5 columns
user id#4 ... 5 columns

我们想要展示的内容:

user id#1 ... 3 columns + 5 columns
user id#2 ... 3 columns
user id#3 ... 5 columns
user id#4 ... 3 columns + 5 columns

虽然这违反直觉,但我们发现在 SQL 中组合两个查询的结果会导致 SQL 查询的运行时间大大降低。

我们查看了子数据集,但据我了解,不可能将来自两个子数据集(或主数据+一个子数据集)的数据混合在一个表中。

我们已经查看了子报表,但据我了解,如果我按照我们的意图将子报表放在详细信息区域中,子报表将为报表中的每一行调用一次查询。但出于性能原因,我们希望运行我们准备的两个查询,并且每个查询只运行一次。

我们认为最合理的方法是我们用Java编写这样的高级报表,并且有可能,但是JavaBean数据源无法访问报表参数。我们的数据库很大,因此我们不能只在没有 where 的情况下进行查询,然后进行过滤,Java 代码需要访问报表参数。

我们目前正在研究实现 JRQueryExecutor as recommended therethere (last comment),甚至利用 scriptlet。

但这听起来真的很先进,我们想知道我们是在思考错误的方式还是朝着错误的方向前进?如果 JRQueryExecutor 是正确的方式,任何示例或文档都会受到欢迎。

我们也在考虑尝试重构我们的 SQL 以仅通过一个查询来实现结果,但我们确实认为报告系统应该允许我们也可以在 Java 中操作数据。

【问题讨论】:

  • 你可能只需要使用 SQL Join 吗?
  • 我提到“虽然它违反直觉,但我们发现在 SQL 中组合两个查询的结果会导致 SQL 查询的运行时间大大降低。”
  • 需要很长时间?你确定在jasper中后处理会更快吗?
  • 在原始java中更快。

标签: jasper-reports


【解决方案1】:

最后,我们使用了一个 scriptlet。在afterReportInit中,继承JRDefaultScriptletparametersMap获取参数和数据源,然后可以从Java填写数据源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2020-02-20
    • 2018-10-28
    • 2016-04-29
    相关资源
    最近更新 更多