2012-10-19 54 views
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; 

其中頻率是重複次數。請放棄您的想法來改善您的查詢。

+0

這個查詢看起來很酷。您是否有理由尋找另一種方式來做到這一點? – Tom

+0

@Tom:因爲我插入了數千條記錄,所以一個小的優化可能會節省大量的時間。那就是原因。 – Vijaychandar

回答

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

如果您有包含去至少一樣高的最大頻排號任何表,你可以這樣:

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不支持遞歸,顯然。

相關問題