有没有办法复制一行?
is there a way to duplicate a row?
我想要一些与 COUNT 工作方式相反的东西,就像一个逆 GROUP BY
(SPLIT 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。
我想要一些与 COUNT 工作方式相反的东西,就像一个逆 GROUP BY
(SPLIT 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。