2017-04-13 40 views
0

我正在將數據庫從一個項目遷移到另一個,並且表格不具有相同的格式,所以我必須正確格式化數據。運行多個插入與MySQL中相同的選擇查詢的數據

這裏是一對夫婦查詢例子:

INSERT INTO db1.first (a,b,c) 
SELECT x.a, z.b, x.c 
FROM  db2.t2 x, db2.t3 z 
WHERE  x.id = z.id 

INSERT INTO db1.second (q,w) 
SELECT x.d, z.e 
FROM  db2.t2 x, db2.t3 z 
WHERE  x.id = z.id 

這裏發生的是,我現在用的是相同的SELECT查詢(這在我的實際情況比這個例子更噁心)以進口的一些數據。唯一不同的是,我沒有爲每個插入使用所有列,但所提取的行完全相同(應用的條件與示例中相同)。

正如你可以清楚地看到,這導致了很多複製粘貼和不便,有沒有辦法將多個插入到不同的表中,而無需複製粘貼我的選擇查詢?

在此先感謝!

回答

2

你可以嘗試爲會話創建臨時表:

CREATE TEMPORARY TABLE IF NOT EXISTS temp AS 
SELECT 
    x.a, z.b, x.c 
FROM 
    db2.t2 x 
INNER JOIN db2.t3 z 
    ON x.id = z.id 

然後用這個表兩個刀片:

INSERT INTO db1.first (a,b,c) 
SELECT a, b, c FROM temp 

INSERT INTO db1.second (q,w) 
SELECT a, b FROM temp 

請注意,我也換成你的隱含表的加盟明確的一個使用INNER JOINON子句。這是目前進行連接的普遍接受的方式。

如果您使用的是其他數據庫,如SQL Server或Oracle,最佳方法可能是對用於插入的常用查詢使用公用表表達式(CTE)。但是由於MySQL不支持CTE,所以使用臨時表是另一種選擇。

請注意,MySQL中的臨時表僅存在於該會話中,並且會話結束時將自動刪除。因此,除非您想在創建它的同一個會話中刪除它,否則不需要顯式刪除它。

+0

謝謝蒂姆,有趣的解決方案。請注意,我有一個錯字(您複製到您的答案中),'z,b'需要是'z.b'。這也暗示了爲什麼我討厭複製粘貼我的查詢哈哈哈。 –

+0

快速問題:我不熟悉表格定義中的術語'TEMPORARY',這是否意味着它被自動刪除?在完成插入操作後,是否需要運行「DROP TABLE temp」?編輯:好的快速編輯你的答案,再次感謝! –

相關問題