有没有办法重复一行?

时间:2018-12-06 00:42:01

标签: sql powerset

我想要一种与COUNT相反的方式,就像倒数GROUP BYSPLIT BY?),但是您可以更自由地使用它。

到目前为止,我已经看到所有“命令”都用于限制或指定,这意味着您无法创建一个更大的表/集,而已拥有的表/集。我正在谈论创建某种动态的集合构造。

例如,有什么方法可以创建幂集或“指数”交叉联接(每一行都与他的size_in_rows个副本联接)?还是某种递归?

我需要的示例:

我有一个包含几个字段的表,每个字段包含信息和一个“ count”整数值。我需要SELECT __并发送相同精确行的许多“计数”副本,才能与数据库外部的另一个程序一一读取。

3 个答案:

答案 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