2010-04-23 45 views
0

我有一個關於對具有不同數據結構(Oracle)的表進行統一插入查詢的問題 結構(Oracle)。讓我詳細說明一個例子:如何複製表中除應該更改的單個列以外的所有數據

tb_customers (
    id NUMBER(3), name VARCHAR2(40), archive_id NUMBER(3) 
    ) 

    tb_suppliers (
    id NUMBER(3), name VARCHAR2(40), contact VARCHAR2(40), xxx, xxx, 
    archive_id NUMBER(3) 
    ) 

所有表中唯一存在的列是[archive_id]。計劃是通過將所有記錄複製(複製)到不同的數據庫分區並相應地增加這些記錄的archive_id來創建數據集的新歸檔。 [archive_id]始終是主鍵的一部分。

我的問題是用select語句來做實際的數據重複。因爲列是可變的,所以我努力想出一個統一的select語句來複制數據並更新archive_id。

一個解決方案(的作品),是迭代在存儲過程中的所有表,並做了:

CREATE TABLE temp as (SELECT * from ORIGINAL_TABLE); 
UPDATE temp SET archive_id=something; 
INSERT INTO ORIGINAL_TABLE (select * from temp); 
DROP TABLE temp; 

我不喜歡這種解決方案非常的DDL命令弄髒所有還原點。

有沒有其他人有任何解決方案?

+0

我想你的示例SQL的倒數第二行應該是: INSERT INTO ** ** TARGET_TABLE(選擇溫度*); – ntziolis 2010-04-23 07:23:21

+0

ty指出,固定 – twiga 2010-05-06 11:37:09

回答

0

如何爲每個基表創建一個全局臨時表?

create global temporary table tb_customers$ as select * from tb_customers; 
create global temporary table tb_suppliers$ as select * from tb_suppliers; 

您不需要每次都創建和刪除這些內容,只是將它們保留原樣。

你的存檔過程是那麼單一交易...

insert into tb_customers$ as select * from tb_customers; 
update tb_customers$ set archive_id = :v_new_archive_id; 
insert into tb_customers select * from tb_customers$; 

insert into tb_suppliers$ as select * from tb_suppliers; 
update tb_suppliers$ set archive_id = :v_new_archive_id; 
insert into tb_suppliers select * from tb_suppliers$; 

commit; -- this will clear the global temporary tables 

希望這有助於。

0

我會建議沒有一個單一的SQL語句的所有表,只是使用和插入。

insert into tb_customers_2 
    select id, name, 'new_archive_id' from tb_customers; 
insert into tb_suppliers_2 
    select id, name, contact, xxx, xxx, 'new_archive_id' from tb_suppliers; 

或者,如果你真的需要所有的人都至少預先創建所有的臨時表的單個SQL語句(如臨時表),並讓他們在原地下一次。然後,只需使用動態sql來引用臨時表。

insert into ORIGINAL_TABLE_TEMP (SELECT * from ORIGINAL_TABLE); 
UPDATE ORIGINAL_TABLE_TEMP SET archive_id=something; 
INSERT INTO NEW_TABLE (select * from ORIGINAL_TABLE_TEMP); 
相關問題