2014-04-25 24 views
1

我想從表A複製/更新數據到表B.表B還有一些額外的列。我嘗試了以下選項。如何在select語句中選擇列名

1) `REPLACE INTO `B` (SHOW FIELDS FROM 'A') SELECT * FROM `A 

2) `REPLACE INTO `B` 
    (SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` 
       WHERE `TABLE_SCHEMA`='test1' AND `TABLE_NAME`='A') SELECT * FROM `A 

但它會引發錯誤。你們可以幫我怎麼選擇名稱與選擇查詢?

UPDATE:

3)如所建議的通過Jerko,

我有兩個表A(warehouse_id,長,LAT)B(warehouse_id,長)

應用於下面的語句。

SET @query = CONCAT('REPLACE INTO `A` (SELECT ', 
        (SELECT GROUP_CONCAT(CONCAT('`',column_name, '`')) 
         FROM information_schema.columns 
         WHERE `TABLE_SCHEMA`='test2' AND `table_name` = 'A'), 
        ' FROM `B`)'); 


PREPARE stmt FROM @query; 
EXECUTE stmt; 

這給了我

「#1054 - 未知列在 '字段列表' 緯度'」 的錯誤

回答

1

其實還有一個辦法

SET @query = CONCAT('REPLACE INTO `A` (', 
        (SELECT GROUP_CONCAT(CONCAT('`',column_name, '`')) 
        FROM information_schema.columns 
        WHERE `TABLE_SCHEMA`='test1' AND `table_name` = 'A' 
        AND column_name IN (SELECT column_name FROM information_schema.columns WHERE table_schema = 'test1' AND table_name='B')) , 
        ') (SELECT ', 
       (SELECT GROUP_CONCAT(CONCAT('`',column_name, '`')) 
        FROM information_schema.columns 
        WHERE `TABLE_SCHEMA`='test1' AND `table_name` = 'A' 
        AND column_name IN (SELECT column_name FROM information_schema.columns WHERE table_schema = 'test1' AND table_name='B')), 
       ' FROM `B`)'); 


PREPARE stmt FROM @query; 
EXECUTE stmt; 
+0

謝謝,但它拋出了錯誤「#1064 - 你的SQL語法有錯誤;檢查對應於你的MySQL服務器版本的手冊,在第1行'NULL'附近使用正確的語法。我是否錯過了上面的查詢?因爲我在 –

+0

之前從未使用過準備好的語句嗎?我運行它在我的數據庫,它的工作原理應該是 –

+0

也許你是錯誤的table_schema和表名稱? –

2

你試過嗎?

insert into B(col1, . . ., coln) 
    select col1, . . ., coln 
    from A; 

也就是說,select子句中從A列表中的字段。在insert列表中列出B的對應列。

如果您需要列的列表,請從INFORMATION_SCHEMA.COLUMNS獲取它們並剪切並粘貼到查詢中。

+0

顯然,這將正常工作。但我想選擇列名作爲選擇語句 –

+0

@davidethell說,這將作爲子查詢? –

+2

您只能使用'prepare'語句在動態SQL中執行此操作。即使這樣,你也必須100%確定兩個表中的列名是相同的,這是你的問題沒有提及的一個條件。 –

3

你不能在mysql中動態地做這個動作,就像你正在做的那樣。 MySQL期望您的列名稱列表直接提供,而不是來自子查詢。

如果你想動態地做到這一點,你將不得不退回到你用來與MySQL交互的任何語言,如PHP或Java。

+0

其必要提供字段名稱? –

+0

使用PHP等另一種語言,您可以先查詢表結構以獲取列名,然後使用它來構建第二個查詢。 – davidethell

+2

@DushyantJoshi - 絕對,是的。想想這個;如果它是自動的,你能想象SQL注入的_wonderful_途徑嗎?基本上沒有防守 - 準備好的聲明不會有任何好處,因爲他們處於錯誤的水平。所以沒有一個理性的RDBMS會爲你做自動擴展...不是它能夠區分常規數據和列名。 –

1

試試這個

INSERT INTO B (field1,field2,...,fieldN) 
     SELECT (field1,field2,...,fieldN) FROM A 
+0

謝謝,但我需要字段作爲子查詢 –

+0

實際上你想要什麼?不起作用? – Sadikhasan

相關問題