我有一个产生一行的查询。我想多次输出这一行,由此查询中的常量确定。查询格式为:
select A.a, B.b, C.c from A
inner join B ..
inner join C ..
where A.a =.. and B.b = .. and C.c = ..
这给出了结果:
[A.a, B.b, C.c]
但我想要的是,鉴于常数是3:
[A.a, B.b, C.c]
[A.a, B.b, C.c]
[A.a, B.b, C.c]
有一种简单的方法吗?在重复查询时使用UNION ALL不起作用,因为我需要使用数值来指定值应该重复的次数。此值将是使用此查询使用 iReport 生成的报表的参数。如果它可以在 iReport 中完成,它也可以工作,但必须能够在非常旧版本的 iReport(3.0.0)中完成。任何帮助将不胜感激,我已经谷歌搜索了几个小时,但无法找到有效的解决方案。这似乎应该是一项简单的任务。
答案 0 :(得分:2)
你为什么需要这个?我想到的一种方法是让数字表有100行(数字从1到100)并与原始查询交叉连接
select t1.* from
(
select A.a, B.b, C.c from A
inner join B ..
inner join C ..
where A.a =.. and B.b = .. and C.c = ..
) as t1 inner join number_table on 1=1
where number<=3
答案 1 :(得分:2)
您可以使用递归SQL生成&#34;表&#34;使用您想要的任意数量的行,然后将其与原始查询结合使用,如下所示:
with somerows(i) as (
select 1 from sysibm.sysdummy1
union all
select i+1 from somerows
where i < ? -- this host variable would specify the number of rows
)
select A.a, B.b, C.c from
somerows,
A
inner join B ..
inner join C ..
where A.a =.. and B.b = .. and C.c = ..
答案 2 :(得分:1)
您需要在Cartesian product中使用表格。使用笛卡尔积将业务数据结果乘以表中的行数。
我会将表生成为内存表而不是物理表。这样您就无法维护其他数据库对象。我将数字表创建为物理表的唯一原因是作为性能优化,因此您不必承担在内存中构建表的成本。但我甚至不确定这会有所帮助,所以我不得不采取一些测量来评估。
您可以通过多种方式创建内存表:
在这些选项中,递归SQL将是最佳选择,因为您可以使用单个SQL语句获得所需的结果,并且听起来您希望使用可能无法灵活构建其中一些的应用程序更复杂的流程。另外两个要么需要动态构建一个SQL语句(对于一个union all),要么多次使用该程序插入。
对于DB2中的递归SQL,您将创建一个基本Recursive CTE来生成所需的行数。
将递归部分与实际业务查询分开,以便代码尽可能清晰。当你在六个月内回到这个问题并且在你的脑海中并不新鲜时,你希望能够在生成的值和业务数据SQL之间看到清晰的界限。
在顶部添加递归CTE,并在原始查询的FROM子句中引用它。这就是你需要的全部:
with genrows(num) as (
select 1 from sysibm.sysdummy1
union all
select num+1 from genrows
where num < ?
)
select A.a, B.b, C.c
from genrows /* and add genrows here to make the Cartesian product */
, A
inner join B ..
inner join C ..
where A.a =.. and B.b = .. and C.c = ..
答案 3 :(得分:0)
这是一个小解决方法,但您可以制作一个包含1到10之间数字的表格。然后你可以用这个表加入你的行,其中number_in_aux_table&lt; =你的常数。