我的学生表为:
我有一个stud_claim
表,是这样:
student_id
是student
表的外键。
在stud_claim
表中,我有paid_date
列.paid_date有一些数据,而某些行为null。我需要更新stu_claim表,其中pay_date为null,并将service_date的值放在该paid_date中,如果paid_date为null。要更新paid_date,它们的另一个条件是匹配id
表的student
和stud_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;
答案 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
失败