2009-10-27 107 views
1

我有兩個具有相同表結構的模式S1和S2。我心底有例子開始:在S1.table1插入之前的更新(Oracle)

我:

 
    ID DATA1  DATA2 
    ---- ---------- ---------- 
    01 data1  test1 
    02 data1  test1 

上S2.table1我:

 
    ID DATA1  DATA2 
    ---- ---------- ---------- 
    01 data2  test2 
    02 data2  test2 

是否有可能選擇一個行(從S1 .table1)更新它(更改ID列的值)並將其插入到S2.table1中?我想編寫單個SQL查詢,它將用作預準備語句(Java)。上S2

最終結果應該是:

 
    ID DATA1  DATA2 
    ---- ---------- ---------- 
    01 data2  test2 
    02 data2  test2 
    03 data1  test1 

所以我插入的第一行從S1.table1,和改變只ID。

感謝, 喬納斯

回答

2

如何

INSERT INTO S2 
SELECT 03, DATA1, DATA2 FROM S1 WHERE ID=01 

也就是說,你只要選擇你想要的數據,但明確指出任何替代數據。

+0

謝謝,好主意。 但是,如果我不想列出所有其他列? 它'像: INSERT INTO S2.table1(SELECT * FROM S1其中id = 01) ,但我想修改ID列(它不自動生成) – negersiu

+0

是啊,這是一個艱難的一個。我也有過要求SELECT EVERYTHING EXCEPT命令的場合,但沒有一個。我想你可以簡單地複製整行,然後立即進行更新。 –

1
INSERT INTO S2 (Data1, Data2) SELECT Data1, Data2 FROM S1 WHERE ID=xxx 

假設S2中的ID是自動增量的(例如通過序列和觸發器)。

+0

使用[序列名稱] .NEXTVAL - 在觸發器內通常不需要這樣做。 –

+0

是的,但觸發器的優點是不需要使用正確的順序。我想這是一個品味問題。 – Lucero

+0

ID列不是自動增加的,我使用了非常簡化的示例,表中實際包含大約50列,並且鍵列(約束唯一)不是自動生成的值。 – negersiu

1

你必須使用一個序列:

insert into s2.table1 
select seq.next_val, data1, data2 
from s1.table1 

序列會一直向上計數。所以當你再次運行時,新的行將被「附加」到現有的行上。

0
insert into s2.table1 (
    select id+1, data1, data2 
    from s1.table1 
    where id=(select max(id) from s1.table1) 
); 
相關問題