2012-01-13 41 views
5

Tôi cần sao chép dữ liệu từ bảng này sang bảng khác. Các bảng không có tất cả các cột hoặc thứ tự giống nhau; nhưng dữ liệu được sao chép luôn ở trong cùng một cột; đó là dữ liệu từ cột foo phải được sao chép sang cột foo.Sao chép dữ liệu bảng có các cột chung

Nếu nó chỉ hai bảng tôi chỉ có thể hardcode các tên cột như:

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

Tuy nhiên có một vài chục bảng, và một số chuyển đổi thêm việc cần phải làm, vì vậy nó sẽ được tốt đẹp nếu tôi có thể nói: Sao chép bất kỳ cột nào phù hợp và bỏ qua phần còn lại.

Tôi đã cố gắng tìm ra cách để có danh sách các cột phổ biến, nhưng bây giờ tôi bị kẹt.

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

bạn có thể sử dụng sql động không? bạn đang sử dụng SQL bên trong một ngôn ngữ lập trình khác? – golimar

+0

điều này nghe giống như một công việc một lần. Điều đó có đúng không? Hay đó là thứ gì đó phải chạy liên tục, có thể trong sản xuất? Nếu nó là một điều một lần, bạn có thể sử dụng mã trên (với một số thay đổi) để tạo ra nhiều SQL hơn, và sau đó chạy SQL được tạo ra. – MJB

+0

Vâng, đó là truy vấn một lần và giải pháp mà tôi đã sử dụng về cơ bản là quy trình hai bước này. Tuy nhiên, sẽ thật tuyệt khi biết cách thực hiện "đúng". – Odalrick

Trả lời

2

tôi lừa tôi đã sử dụng trong quá khứ để có hiệu lực tốt là viết một truy vấn mà trả về SQL, sau đó chỉ cần sao chép-dán nó vào vỏ lệnh db. Trong trường hợp này, đây sẽ là truy vấn của bạn:

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; 

Điều này làm cho sử dụng các tiện GROUP_CONCAT chức năng mysql rằng tập hợp các giá trị vào một CSV - hoàn hảo cho việc tạo ra một danh sách các tên cột để tạo SQL

Tôi cũng bọc truy vấn của bạn trong một bí danh để chúng tôi có thể chọn từ nó.

+0

Và sau đó truy vấn có thể được thực hiện ngay lập tức theo [câu hỏi này] (http://stackoverflow.com/questions/999200/is-it-possible-to-execute-a-string-in-mysql). Cảm ơn bạn. Tôi vẫn cảnh giác với bất kỳ điều gì tương tự như eval. – Odalrick

Các vấn đề liên quan