在不使用游标的情况下基于值插入重复记录

时间:2012-10-19 13:27:38

标签: mysql sql insert duplication

我在数据库中遇到了问题。我必须根据值在另一个表上插入特定记录的重复记录。 首先,我使用游标来获取每个记录并获得我想要的重复次数,之后使用另一个游标进行复制。一切都很好。但如果超过500的记录,我死得很慢。然后我做了一些研究,找到了一种无光标插入的方法。

INSERT INTO report(id, Name) 
        SELECT i.id,i.Name FROM (SELECT  1  AS id 
        UNION SELECT  2  
        UNION SELECT 3 
        UNION SELECT 4 
        UNION SELECT 5 
        UNION SELECT 6 
        UNION SELECT 7 
        UNION SELECT 8 
        UNION SELECT 9 
        UNION SELECT 10) AS o  
        INNER  JOIN table  i WHERE o.id<=i.frequence; 

其中频率是重复次数。请放弃您的想法以改善您的查询。

2 个答案:

答案 0 :(得分:1)

您可以尝试创建一个表,其中包含1到10之间每个值的记录,然后加入到该表中。我不确定它会更快。你必须试验它。

在此示例中,值为1到10的表称为“dup”,包含这些值的字段称为“id”。

INSERT INTO report(id, Name) 

SELECT i.id, i.Name 

FROM   table i 

       JOIN dup d
       ON d.id <= i.frequence; 

答案 1 :(得分:1)

如果您的任何表包含的行号至少与最大频率一样高,您可以这样:

INSERT INTO report(id, Name) 
        SELECT i.id,i.Name FROM table i 
            inner join (
                select distinct some_row_number_column from some_table
            ) o on o.some_row_number_column <= i.frequence; 

这与你正在做的基本相同,但它避免了凌乱的union all语句。

或者你可以创建一个游标,将1到最大frequence的数字插入临时表,然后在join中使用它。或者您可以use a row numbering variable生成必要的序列。基本上,做任何会生成从1到最大值的连续数字列表的任何事情。

我通常会使用递归(DB2语法):

INSERT INTO report(id, Name) 
        with num_list (num) as (
             values (1)
                 union all 
             select num + 1 from num_list
                 where num < (select max(frequence) from table)
        )
        SELECT i.id,i.Name FROM table i 
            inner join num_list on num_list.num <= i.frequence; 

但是,MySQL显然不支持递归。