2013-05-16 64 views
0

我有一對夫婦的含有3個尤爲重要欄目登出的10百代完全相同MySQL表的表名遵循的模式:name1_name2:創建列,然後從表名填充它的許多表simultaneously_MYSQL

Table 1 name: r_t 

chr, chromStart, chromEnd... 

Table 2 name: y_g 

chr, chromStart, chromEnd... 

有一個MasterTable:

full_table_name, table_name_before_underscore, table_name_after_underscore 

第一列由每個表(r_t爲第1臺的全名,y_g - 對於2日),第2列 - 表名的下劃線([Rÿ)之前的第一部分,3D - 下劃線(牛逼

後,我需要得到UNION_all_table與每個表的chr,chrStart,chromEnd行和每個表名中的第1部分(在下劃線之前)和第2部分(在下劃線之後)組成的2個附加列區分開來,以區分數據來自哪個表。對於2臺以上:對於修改表,更新表

Union_all_table: 
chr, chrStart, chromEnd, table_name_before_underscore, table_name_after_underscore 
1, 3456, 3487, r, t; 
1, 3778, 3799, y, g; 

預處理語句不工作,所以我不能看到,僅在MySQL的方式來做到這一點。

非常感謝您的任何想法!

+2

*爲什麼*你有「幾百個完全相同的MYSQL表」?這是一個非規範化的模式,這是(一般來說)設計難以置信的糟糕。更好地合併到一個表格中,並添加一列可識別其差異的額外列。 – eggyal

+0

Eggyal,我從互聯網上下載了這樣的演示文稿 –

回答

0

你是什麼意思「準備好的聲明不適用於更改表,更新表」?以下works for me

CREATE PROCEDURE proc() 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE a, b CHAR(1); 
    DECLARE cur CURSOR FOR 
    SELECT table_name_before_underscore, 
      table_name_after_underscore 
    FROM master; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    OPEN CUR; 
    read_loop: LOOP 
    FETCH cur INTO a, b; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    SET @query = CONCAT('INSERT INTO Union_all_table SELECT ', 
         'chr, chromStart, chromEnd, \'', 
         a, '\', \'', b, '\' FROM ', 
         a, '_', b); 
    PREPARE stmt FROM @query; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    END LOOP; 
    CLOSE cur; 
END // 

CALL proc() // 

注意,它創建一個表,而不是工會的看法,所以它不會反映在您的輸入表的任何修改。我建議你一次執行這個查詢,然後廢棄你的原始表並用這個新的聯合表的視圖替換它們。

+0

MvG,非常感謝您的回答!奇蹟般有效!!! –