有没有办法复制一行?

is there a way to duplicate a row?

我想要一些与 COUNT 工作方式相反的东西,就像一个逆 GROUP BYSPLIT BY?)但你可以更自由地工作。

到目前为止,我看到所有 "commands" 都是为了限制或规范,这意味着您不能创建比现有的更大的 table/set。我说的是创建某种动态的集合构造。

例如,有什么方法可以创建幂集或 "exponential" 交叉连接'(每行与他自己的 size_in_rows 个副本连接)?或者某种递归?

我需要的示例:

我有一个包含几个字段的 table,每个字段都包含信息和一个 "count" 整数值。我需要 SELECT __ 并发送同一行的许多 "count" 副本,以便用数据库外的另一个程序一个一个地读取它。

类似

SELECT * FROM T
UNION ALL
SELECT * FROM T WHERE count>1
UNION ALL
SELECT * FROM T WHERE count>2

应该能让你达到目的,但如果你想让疯狂的计数也能正常工作,很快就会变得不切实际。

还有一些事情:你不是在构建集合,而是在构建包。根据定义,集合不能有重复项。

交叉连接不适合您的目的,因为它的作用是生成更多的列,而您在生成更多行之后所在的位置。

您没有指定您的 DBMS,但是使用 PostgreSQL 这真的很简单:

select t.*
from the_table t
  cross join generate_series(1, t.count)
order by t.id

假设 table 的主键列名为 id,那么 order by t.id 将 "duplicated" 行放在一起。

这是 SQL 服务器的一种方法: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