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; 

ここで、frequence は重複の数です。クエリを改善するためにアイデアをドロップしてください。

4

2 に答える 2

1

1 から 10 までの各値のレコードを含むテーブルを作成してから、それに結合することができます。私はそれがもっと速くなるかどうかはわかりません。あなたはそれを試してみる必要があります。

この例では、1 から 10 までの値を持つテーブルは「du​​p」と呼ばれ、これらの値を含むフィールドは「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 に答える