2012-12-29 202 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