2012-01-13 19 views
5

Verileri bir tablodan diğerine kopyalamam gerekir. Tabloların hepsi aynı sütunlara veya sıralamaya sahip değildir; ancak kopyalanacak veriler her zaman aynı sütunlardadır; foo numaralı sütundan gelen veriler foo sütunlarına kopyalanmalıdır.Tablo sütunlarını ortak sütunlarla kopyalama

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

Ancak birkaç düzine tablolar vardır ve bazı ekstra dönüşüm yapılması gerektiğini, bu yüzden güzel olurdu: o Sadece gibi sütun adlarını hardcode olabilir sadece iki tablo olsaydı

Sadece söyleyebilseydim: Eşleşen sütunları kopyala ve geri kalanını görmezden gel.

Genel sütunların listesini nasıl alacağımı bulmayı başardım, ancak şimdi takılıyorum. Ben iyi etki için geçmişte kullanmış

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) 
; 
+1

Dinamik sql'yi kullanabilir misiniz? Başka bir programlama dili içinde SQL kullanıyor musunuz? – golimar

+0

bu bir seferlik görev gibi geliyor. Bu doğru mu? Ya da tekrar tekrar çalışmak zorunda olan, belki de üretimde olan bir şey mi? Tek seferlik bir şey ise, daha fazla SQL oluşturmak için yukarıdaki kodu (bazı değişikliklerle) kullanabilir ve ardından oluşturulan SQL'i çalıştırabilirsiniz. – MJB

+0

Evet, bu bir kerelik bir sorgudur ve son kullanmadığım çözüm esasen bu iki aşamalı işlemdir. Yine de, "düzgün" nasıl yapılacağını bilmek güzel olurdu. – Odalrick

cevap

2

ben hile sonra sadece db komut kabuğu içine kopyalayıp yapıştırın SQL döndüren bir sorgu yazmaktır. - SQL

da

Ben üretmek için sütun isim listesini oluşturmak için mükemmel

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; 

Bu CSV içine değeri toplayan mysql en kullanışlı GROUP_CONCAT fonksiyonunun kullanımı yapar: Bu durumda, bu sorgu olurdu sorgunuzu bir takma adla doldurduk, böylece seçebileceğiz.

+0

Ve sonra sorgu [bu soru] (http://stackoverflow.com/questions/999200/is-it-possible-to-execute-a-string-in-mysql) göre anında gerçekleştirilebilir. Teşekkür ederim. Yine de, değerlendirmeye benzer herhangi bir şeye karşı ihtiyatlıyım. – Odalrick

İlgili konular