合并语句在尝试合并两个表时在oracle上给出错误

时间:2019-10-19 11:14:46

标签: sql database oracle oracle11g

我的学生表为:

enter image description here

我有一个stud_claim表,是这样:

enter image description here

student_idstudent表的外键。

stud_claim表中,我有paid_date列.paid_date有一些数据,而某些行为null。我需要更新stu_claim表,其中pay_date为null,并将service_date的值放在该paid_date中,如果paid_date为null。要更新paid_date,它们的另一个条件是匹配id表的studentstud_claim表的stud_claim

我尝试使用merge语句,但是不起作用:

MERGE INTO offc.stud_claim A
USING offc.student B
ON (A.student_id=B.id AND A.PAID_DATE IS NULL)
WHEN MATCHED THEN
UPDATE SET A.PAID_DATE=B.SERVICE_DATE

还是仅使用update语句,是否也可能?

我在以下地方出错:

ORA-38104: Columns referenced in the ON Clause cannot be updated: "A"."PAID_DATE"

我也在sql中尝试过:

update offc.stud_claim a set paid_date=(select id from offc.student b where b.id=a.student_id) where a.paid_id is NULL;

2 个答案:

答案 0 :(得分:1)

简单的更新语句就足够了。更新声明中存在问题。(您选择的是id而不是service_date

Update offc.stud_claim a 
set paid_date=
(select service_date
   from offc.student b 
  where b.id=a.student_id) 
where a.paid_date is NULL;

merge语句中,不能update子句中使用的column on,因此可以使用WHERE子句来实现它,如下所示:

MERGE INTO offc.stud_claim A
USING offc.student B
ON (A.student_id=B.id)
WHEN MATCHED THEN
UPDATE SET A.PAID_DATE=B.SERVICE_DATE
WHERE A.PAID_DATE IS NULL;

干杯!

答案 1 :(得分:0)

这是使用可更新联接视图的简单UPDATE 更新的方法。

首先,您将两个表连接在一起,选择应更新的列和更新的源列:

select a.id, a.service_date, b.paid_date
from student a
join student_claim b
on a.id = b.student_id
where b.paid_date is NULL and
a.service_date is not NULL

请注意,通过执行此选择,您可以验证未来的UPDATE的双拼。

我是排除带有service_date is NULL的行,因为您可能不想将NULL更新为NULL(以防列为 nullable

然后将联接查询包装为子查询并对其执行UPDATE

update (
select a.id, a.service_date, b.paid_date
from student a
join student_claim b
on a.id = b.student_id
where b.paid_date is NULL and
a.service_date is not NULL
)
set paid_date = service_date

请注意,执行此操作的唯一前提是表STUDENT键保留。也就是说,联接键上有一个唯一索引(如果ID是主键,则很可能是这种情况)。

否则,您将获得此异常ORA-01779: cannot modify a column which maps to a non key-preserved table

相反,如果STUDENT表中有更多具有相同MERGE的行,则可以使用ID语句,但是该语句将以ORA-30926: unable to get a stable set of rows in the source tables失败