一个不错的MERGE 选项:
merge into pension p
using employee e
on (p.persno = e.persno)
when matched then
update set p.stno = e.stno;
使用您发布的示例数据(稍作修改;不想输入那么多):
SQL> select * From pension;
PERSNO STNO AMT
------ ---------- ----------
c01234 1
c01234 3
c01234 5
c02563 2
c02563 9
c02563 2
6 rows selected.
SQL> select * From employee;
PERSNO STNO
------ ----------
c01234 1521
c02563 2365
c01891 2593
SQL> merge into pension p
2 using employee e
3 on (p.persno = e.persno)
4 when matched then
5 update set p.stno = e.stno;
6 rows merged.
SQL> select * from pension;
PERSNO STNO AMT
------ ---------- ----------
c01234 1521 1
c01234 1521 3
c01234 1521 5
c02563 2365 2
c02563 2365 9
c02563 2365 2
6 rows selected.
SQL>
但是,如果EMPLOYEE 表中有重复的PERSNO:
SQL> select * from employee order by persno;
PERSNO STNO
------ ----------
c01234 1521 --> two rows for
c01234 9999 --> c01234
c01891 2593
c02563 2365
查询不再起作用,因为它无法决定使用这两行中的哪一行。 你知道吗?如果是这样,请告诉我们。或者,如果不允许重复,请将其删除,merge 将再次起作用。
SQL> merge into pension p
2 using employee e
3 on (p.persno = e.persno)
4 when matched then
5 update set p.stno = e.stno;
merge into pension p
*
ERROR at line 1:
ORA-30926: unable to get a stable set of rows in the source tables
SQL>
如果您决定选择例如MIN(EMPLOYEE.STNO) 值,那么您将查询重写为
SQL> merge into pension p
2 using (select e.persno, min(e.stno) stno
3 from employee e
4 group by e.persno
5 ) x
6 on (p.persno = x.persno)
7 when matched then
8 update set p.stno = x.stno;
6 rows merged.
SQL>
它会再次工作。