【问题标题】:How to generate multiple records for every record in a table using a column value in MySQL?如何使用 MySQL 中的列值为表中的每条记录生成多条记录?
【发布时间】:2015-06-23 11:15:54
【问题描述】:

考虑以下场景:

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 中,这可以通过使用按级别连接来轻松完成。如何使用 MySQL 做到这一点。请注意,我确实在名为 count 的第三列中有要进行的迭代次数。

【问题讨论】:

    标签: mysql sql database loops iteration


    【解决方案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 列可以帮助生成这样的表。

    【讨论】:

    • 这是您提供的一个非常优雅的解决方案。我有很多关于 MySQL 的知识。
    【解决方案2】:

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

    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 
    

    【讨论】:

    • 检查上述解决方案。很漂亮。
    【解决方案3】:

    作为一个想法,您可以简单地使用以下代码:

    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 表达式来生成那些需要的行。 :-)

    【讨论】:

    • 问题标记为“mysql”,MySQL 不支持此语法。
    • 啊,好吧。没见过。我看过 SQL-Server 标签。也许标签后来被删除/更改了?无论如何,如果以后有人需要这个来解决他自己的问题,我会留下它。
    • @Ionic - 别担心朋友。也会检查 SQL Server。
    猜你喜欢
    • 2017-01-02
    • 2015-01-26
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2012-03-26
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多