簡體   English   中英

使用公共列復制表數據

[英]Copy table data with common columns

我需要將數據從一個表復制到另一個表。 表沒有所有相同的列或順序; 但是要復制的數據總是在同一列中; 這是來自列foo數據應該被復制到列foo

如果只有兩個表我可以像硬編碼的列名:

INSERT INTO table_target ( column1, column2, column4 ) 
  SELECT column1, column2, column4 FROM table_source;

然而,有幾十個表,並且需要進行一些額外的轉換,所以如果我可以說:復制任何匹配的列並忽略其余的,那將是很好的。

我已經設法弄清楚如何獲得常見列的列表,但現在我被卡住了。

SELECT src.col
  FROM (SELECT COLUMN_NAME as col
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'table_target') as trg
INNER JOIN 
  (SELECT COLUMN_NAME as col
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'table_source') as src ON (src.col=trg.col)
; 

我在過去使用過的效果很好,就是編寫一個返回SQL的查詢,然后將其復制粘貼到db命令shell中。 在這種情況下,這將是您的查詢:

SELECT CONCAT(
    'INSERT INTO table_target (',  
    GROUP_CONCAT(trg.col), -- produces output like "col1, col2, col3"
    ') SELECT ',
    GROUP_CONCAT(trg.col), -- produces output like "col1, col2, col3"
    ' FROM table_source;') as sql_stmt
FROM (
(SELECT COLUMN_NAME as col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_target') as trg
INNER JOIN 
(SELECT COLUMN_NAME as col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_source') as src ON src.col=trg.col) x;

這使用了mysql方便的GROUP_CONCAT函數,該函數將值聚合為CSV - 非常適合創建用於生成SQL的列名列表

我還將您的查詢包裝在一個別名中,以便我們可以從中進行選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM