如何使用 MySQL 中的列值为 table 中的每条记录生成多条记录?
How to generate multiple records for every record in a table using a column value in MySQL?
考虑以下场景:
Area Code Count
BP 90-99 10
CL 78-87 10
我需要为这两个生成十条记录。
Area Code
BP 90
BP 91
BP 92
BP 93
BP 94
BP 95
BP 96
BP 97
BP 98 and so on.
在 oracle 中,这可以通过使用 connect by level 轻松完成。如何使用 MySQL 执行此操作。请注意,我在名为计数的第三列中确实有要进行的迭代次数。
您需要 table 个号码。这可以作为派生的 table 即时生成:
select area,
(substring_index(code, '-', 1) + n.n - 1) as code
from (select 1 as n union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all select 7 union all
select 8 union all select 9 union all select 10
) n join
scenario s
on n.n <= s.count;
您需要确保数字列表足够大以达到 table 中的最大计数。如果您有 table 个可用号码,这会很方便。通常,auto_increment
列可以帮助生成这样的 table.
使用数字 table 并尝试这种方法
Create table numbers(number int)
insert into numbers(number)
select 1 union all
select 2 union all
.
.
.
select 100
select t1.area, left(code,locate('-',code)-1)*1 from table as t1
inner join numbers as t2 on 1=1
where left(code,locate('-',code)-1)*1 +number
<=substring(code,locate('-',code)+1,length(code))*1
作为一个想法,您可以简单地使用此代码:
CREATE TABLE #tab (area nchar(2), code nvarchar(10), count int)
INSERT INTO #tab(area, code, count)
VALUES(N'BP',N'90-99', 10),(N'CL',N'78-87',10)
SELECT *
FROM #tab t
OUTER APPLY (
SELECT TOP(t.count) ROW_NUMBER() OVER(ORDER BY object_id) + CONVERT(int,SUBSTRING(t.code,1,PATINDEX(N'%-%',t.code)-1)) as nr
FROM sys.all_objects
) as oa
DROP TABLE #tab
在这种情况下,我使用 sys.all_objects
只是为了让 table 对所有内容进行编号。您可以使用所有其他 table。甚至 #tab
本身,如果它足够大以具有足够的行。另一种解决方案是使用 CTE
表达式来生成那些需要的行。 :-)
考虑以下场景:
Area Code Count
BP 90-99 10
CL 78-87 10
我需要为这两个生成十条记录。
Area Code
BP 90
BP 91
BP 92
BP 93
BP 94
BP 95
BP 96
BP 97
BP 98 and so on.
在 oracle 中,这可以通过使用 connect by level 轻松完成。如何使用 MySQL 执行此操作。请注意,我在名为计数的第三列中确实有要进行的迭代次数。
您需要 table 个号码。这可以作为派生的 table 即时生成:
select area,
(substring_index(code, '-', 1) + n.n - 1) as code
from (select 1 as n union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all select 7 union all
select 8 union all select 9 union all select 10
) n join
scenario s
on n.n <= s.count;
您需要确保数字列表足够大以达到 table 中的最大计数。如果您有 table 个可用号码,这会很方便。通常,auto_increment
列可以帮助生成这样的 table.
使用数字 table 并尝试这种方法
Create table numbers(number int)
insert into numbers(number)
select 1 union all
select 2 union all
.
.
.
select 100
select t1.area, left(code,locate('-',code)-1)*1 from table as t1
inner join numbers as t2 on 1=1
where left(code,locate('-',code)-1)*1 +number
<=substring(code,locate('-',code)+1,length(code))*1
作为一个想法,您可以简单地使用此代码:
CREATE TABLE #tab (area nchar(2), code nvarchar(10), count int)
INSERT INTO #tab(area, code, count)
VALUES(N'BP',N'90-99', 10),(N'CL',N'78-87',10)
SELECT *
FROM #tab t
OUTER APPLY (
SELECT TOP(t.count) ROW_NUMBER() OVER(ORDER BY object_id) + CONVERT(int,SUBSTRING(t.code,1,PATINDEX(N'%-%',t.code)-1)) as nr
FROM sys.all_objects
) as oa
DROP TABLE #tab
在这种情况下,我使用 sys.all_objects
只是为了让 table 对所有内容进行编号。您可以使用所有其他 table。甚至 #tab
本身,如果它足够大以具有足够的行。另一种解决方案是使用 CTE
表达式来生成那些需要的行。 :-)