0

我在数据库中遇到问题。我必须根据一个值在另一个表上插入特定记录的重复记录。首先,我使用游标获取每条记录并获取我想要的重复次数,然后使用另一个游标进行重复。一切正常。但是如果记录超过 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; 

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

4

2 回答 2

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; 
于 2012-10-19T14:20:57.940 回答
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. 或者您可以使用行编号变量来生成必要的序列。基本上,做任何可以生成从 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 显然不支持递归。

于 2012-10-19T14:27:06.677 回答