2012-12-29 236 views
0

我試圖從一個表插入不同的值到另一個。我的目標表有一個主鍵studentid,當我執行不同的id從源到目標加載成功。當我試圖加載一堆列從源到目標包括student_id,我得到一個錯誤違反唯一約束。目標上只有一個約束,它是studentid上的主鍵。oracle唯一約束

我的查詢看起來像這樣(只是一個例子)

insert into target(studentid, age, schoolyear) 
    select distinct id, age, 2012 from source 

爲什麼上面的查詢返回在其中如下面的查詢工作完全正常

insert into target(studentid) 
    select distinct id from source 

幫我解決這個錯誤。

謝謝你的時間。

+0

您需要決定_which_行承擔多'id',其中如下面的第一個答案中指出,其他列_not_不同。您將需要執行一些彙總'MIN(),MAX()'等。 –

+0

感謝您的答覆。我理解這個問題。我想要id的唯一值和其餘列的相應值。我怎樣才能做到這一點。 ? – user1751356

回答

2

在你第一個查詢您所選擇的三列即不同的組合,

select distinct id, age, 2012 from source 

不是明顯的標識孤單。在這種情況下,可能存在重複的ID。 例如,你上面的查詢的有效期爲這個

id age 
1 23 
1 24 
1 25 
2 23 
3 23 

但在你第二個查詢你只選擇不同的ID

select distinct id from source 

因此,這將返回象,

id 
1 
2 
3 

在這種情況下,沒有辦法複製重複項,並且將目標插入目標將不會失敗 。

如果你真的想這樣做批量插入與目標約束,然後去 任何聚合函數

select id, max(age), max(2012) group by id from source 

或者,如果你不想從源代碼丟失任何記錄到target,然後刪除目標的約束,插入它。

希望這有助於

+0

因此,如果我將id放入括號中,應該如何? – user1751356

+0

如果你只關心id列,那麼明顯的id是完美的。 – Mari

+0

是的,我現在明白了這個問題。那麼處理它的正確方法是什麼?我試圖插入目標(studentid,年齡,schoolyear) 選擇(獨特的編號),年齡,2012年從源,但我缺少表達錯誤。 – user1751356