我想要一种与COUNT相反的方式,就像倒数GROUP BY
(SPLIT BY
?),但是您可以更自由地使用它。
到目前为止,我已经看到所有“命令”都用于限制或指定,这意味着您无法创建一个更大的表/集,而已拥有的表/集。我正在谈论创建某种动态的集合构造。
例如,有什么方法可以创建幂集或“指数”交叉联接(每一行都与他的size_in_rows个副本联接)?还是某种递归?
我需要的示例:
我有一个包含几个字段的表,每个字段包含信息和一个“ count”整数值。我需要SELECT __并发送相同精确行的许多“计数”副本,才能与数据库外部的另一个程序一一读取。
答案 0 :(得分:2)
您没有指定DBMS,但是使用PostgreSQL确实很简单:
select t.*
from the_table t
cross join generate_series(1, t.count)
order by t.id
假设表的主键列名为id
,则order by t.id
将“重复的”行保持在一起。
答案 1 :(得分:1)
类似
SELECT * FROM T
UNION ALL
SELECT * FROM T WHERE count>1
UNION ALL
SELECT * FROM T WHERE count>2
应该可以带您到那里,但是如果您想要疯狂的计数也可以工作,那么很快就会变得不切实际。
更多的事情:您不是在构建集合,而是在构建包。根据定义,集不能重复。
交叉连接不适合您的目的,因为交叉连接会产生更多的列,而在产生更多的行之后您将位于此处。
答案 2 :(得分:1)
这是SQL Server的一种方法:Fiddle Example
declare @rowToBeCopiedId bigint = 1
, @count int = 10
; with noRowsToInsertCte
(
select 1 x
where @count > 0
union all
select x + 1
from noRowsToInsertCte
where @count > x
)
insert MyTable (col1, col2)
select col1, col2
from MyTable
cross join noRowsToInsertCte
where id = @rowToBeCopiedId
如果您不想复制数据库中的记录,而只想复制结果集中的记录,则可以执行以下操作。此示例在数据中使用一列来说明相关记录应重复多少次,并使用视图使您轻松重用此逻辑:
create view vMyTableWithCount as
with innerCte as
(
select id
, col1
, col2
, cnt
, 1 i
from MyTable
where cnt > 0
union all
select id
, col1
, col2
, cnt
, i + 1
from innerCte
where i < cnt
)
select *
from innerCte
有关更多背景信息,请参见fiddle example。