Sql 多次选择同一行
我有一个生成一行的查询。我想多次输出这一行,由这个查询中的一个常量决定。查询的格式为:Sql 多次选择同一行,sql,jasper-reports,db2,ireport,Sql,Jasper Reports,Db2,Ireport,我有一个生成一行的查询。我想多次输出这一行,由这个查询中的一个常量决定。查询的格式为: 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] 有没有一个简单的方法可以做到这一点?
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版本中实现。任何帮助都将不胜感激,我已经在谷歌上搜索了几个小时,但找不到有效的解决方案。看起来这应该是一项简单的任务。你为什么需要这个?我想到的一种方法是让数字表具有从1到100的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到100的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到10的数字。然后,您可以将您的行与该表连接,其中,aux_表中的数字_这是一个小的解决方法,但您可以创建一个表,例如,包含1到10的数字。然后,您可以将您的行与此表连接,其中,可以使用递归SQL生成一个包含任意多行的表,然后将其与原始查询连接,类似于:
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 = ..
您可以使用递归SQL生成一个包含任意多行的表,然后将其与原始查询联接,如下所示:
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 = ..
您将需要一个表以在中使用。使用笛卡尔乘积将业务数据结果乘以表中的行数 我会将该表生成为内存中的表,而不是物理表。这样您就不需要维护额外的数据库对象。我将数字表创建为物理表的唯一原因是性能优化,这样您就不会一直在内存中构建该表。但我甚至不确定这是否有帮助,所以我不得不采取一些措施来评估 您可以通过以下几种方式创建内存中的表: 递归SQL。 声明的全局临时表,是否插入?把数字放进去。 将一组单行查询合并在一起。 在这些选项中,递归SQL将是最好的选项,因为您可以通过一条SQL语句获得所需的结果,而且听起来您希望使用的应用程序可能不具备构建这些更复杂流程的灵活性。另外两种方法要么需要为union all动态构建SQL语句,要么需要多次使用该程序进行插入 对于DB2中的递归SQL,您将创建一个basic来生成所需的行数 将递归部分与实际业务查询分开,以便代码尽可能清晰。当您在六个月后再次谈到这一点时,您的想法并不新鲜,您希望能够看到生成的值和业务数据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 = ..
您将需要一个表以在中使用。使用笛卡尔乘积将业务数据结果乘以表中的行数 我会将该表生成为内存中的表,而不是物理表。这样您就不需要维护额外的数据库对象。我将数字表创建为物理表的唯一原因是性能优化,这样您就不会一直在内存中构建该表。但我甚至不确定这是否有帮助,所以我不得不采取一些措施来评估 您可以通过以下几种方式创建内存中的表: 递归SQL。 声明的全局临时表,是否插入?把数字放进去。 将一组单行查询合并在一起。 在这些选项中,递归SQL将是最好的选项,因为您可以通过一条SQL语句获得所需的结果,而且听起来您希望使用的应用程序可能不具备构建这些更复杂流程的灵活性。另外两种方法要么需要为union all动态构建SQL语句,要么需要多次使用该程序进行插入 对于DB2中的递归SQL,您将创建一个basic来生成所需的行数 将递归部分与实际业务查询分开,以便代码尽可能清晰。当你在六个月后回到这一点时,你的脑海中并不新鲜,你希望能够看到生成的价值和你的业务之间的清晰划分 ess数据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 = ..
我要做的是创建一个报告,为给定的文章打印N个条形码标签。这个解决方案很有效,伊汉克斯。但我会暂时接受这个答案,因为我希望有一个答案不需要创建新表。在内存中使用物理表与生成表相比有一些缺点。首先,您将得到一个没有业务价值的数据库对象,它是维护例程的永久部分。我不认为有任何令人信服的理由使用物理表而不是使用递归CTE之类的生成表来生成大量行。我试图创建一个报告,为给定的文章打印N个条形码标签。这个解决方案很有效,伊汉克斯。但我会暂时接受这个答案,因为我希望有一个答案不需要创建新表。在内存中使用物理表与生成表相比有一些缺点。首先,您将得到一个没有业务价值的数据库对象,它是维护例程的永久部分。我不认为有任何令人信服的理由使用物理表而不是像递归CTE那样使用生成的表来生成许多行。是的,我自己更喜欢递归CTE选项,并且可能会完全忽略其他选项-你能给出一个他可以使用的示例吗?是的,我自己更喜欢递归CTE选项,可能会完全忽略其他选项——你能给他举个例子吗?