我在数据库中遇到了问题。我必须根据值在另一个表上插入特定记录的重复记录。 首先,我使用游标来获取每个记录并获得我想要的重复次数,之后使用另一个游标进行复制。一切都很好。但如果超过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;
其中频率是重复次数。请放弃您的想法以改善您的查询。
答案 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显然不支持递归。