2012-01-13 15 views
5

मुझे डेटा को एक टेबल से दूसरे में कॉपी करने की आवश्यकता है। टेबल में सभी समान कॉलम या ऑर्डर नहीं होते हैं; लेकिन प्रतिलिपि बनाने वाला डेटा हमेशा एक ही कॉलम में होता है; यह कॉलम 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) 
; 
+1

क्या आप गतिशील एसक्यूएल का उपयोग कर सकते हैं? क्या आप किसी अन्य प्रोग्रामिंग भाषा के अंदर एसक्यूएल का उपयोग कर रहे हैं? – golimar

+0

यह एक बार कार्य की तरह लगता है। क्या यह सच है? या यह ऐसा कुछ है जिसे उत्पादन में बार-बार चलाना पड़ता है? यदि यह एक बार की बात है, तो आप अधिक SQL उत्पन्न करने के लिए उपरोक्त कोड (कुछ परिवर्तनों के साथ) का उपयोग कर सकते हैं, और उसके बाद उत्पन्न SQL चला सकते हैं। – MJB

+0

हां यह एक बार पूछताछ है, और जिस समाधान का मैं उपयोग कर रहा हूं वह अनिवार्य रूप से यह दो चरण प्रक्रिया थी। फिर भी, यह जानना अच्छा होगा कि इसे "ठीक से" कैसे किया जाए। – Odalrick

उत्तर

2

मैं चाल मैं अच्छे प्रभाव के लिए अतीत में इस्तेमाल किया है एक प्रश्न है कि SQL देता है, तो बस यह डाटाबेस आदेश खोल में कॉपी-पेस्ट लिखने के लिए है। - एसक्यूएल

मैं भी पैदा करने के लिए स्तंभ नामों की एक सूची बनाने के लिए एकदम सही

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; 

यह है कि एक CSV में मूल्य एकत्रित करता है जिसकी mysql का काम GROUP_CONCAT समारोह का उपयोग करता है: इस मामले में, यह आपकी क्वेरी किया जाएगा अपनी क्वेरी को उपनाम में लपेटा ताकि हम इसका चयन कर सकें।

+0

और फिर क्वेरी को तुरंत [इस प्रश्न] के अनुसार निष्पादित किया जा सकता है (http://stackoverflow.com/questions/999200/is-it-possible-to-execute-a-string-in-mysql)। धन्यवाद। फिर भी मैं कुछ भी सावधान हूं जो eval के समान है। – Odalrick

संबंधित मुद्दे