如何使用MySQL中的列值为表中的每条记录生成多条记录?

时间:2015-06-23 11:15:55

标签: mysql sql database loops iteration

考虑以下情况:

Area    Code
BP      90
BP      91
BP      92
BP      93
BP      94
BP      95
BP      96
BP      97
BP      98 and so on.

我需要为这两个记录生成10条记录。

ng-click = "toggle123('{{ChildNames.id}}')">

在oracle中,可以通过逐层连接轻松完成。如何使用MySQL做到这一点。请注意,我确实在第三列中进行了迭代次数,称为count。

3 个答案:

答案 0 :(得分:1)

您需要有一张数字表。这可以在运行中生成为派生表:

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;

您需要确保数字列表足够大,以便在表格中获得最大数量。如果您有可用的数字表,这很方便。通常,auto_increment列可以帮助生成这样的表格。

答案 1 :(得分:0)

使用数字表并尝试这种方法

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 

答案 2 :(得分:0)

就像一个想法,你可以简单地使用这个代码:

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来获取表格来编号。你可以使用你拥有的每一张桌子。即使是#tab本身,如果它足够大以至于有足够的行数。另一种解决方案是使用CTE表达式来生成所需的行。 : - )