I am working with an Oracle 10g Database.
I have the following two tables:
T_DEBTOR :
- ID_DEBTOR
- HEADER
T_ELEMENT :
-
You can do this by updating the results of a select, but the tables have to be 'key preserved':
SQL> create table t_debtor ( id_debtor integer, header varchar2(10));
Table created.
SQL> create table t_element (id_element integer, id_debtor integer, insurer varchar2(10));
Table created.
SQL> insert into t_debtor values (1, 'something');
1 row created.
SQL> insert into t_debtor values (2, 'else');
1 row created.
SQL> insert into t_debtor values (3, null);
1 row created.
SQL>
SQL> insert into t_element values (1, 1, 'foo');
1 row created.
SQL> insert into t_element values (2, 2, null);
1 row created.
SQL> insert into t_element values (3, 3, 'bar');
1 row created.
SQL> commit;
Commit complete.
That creates your tables (hint - it's very useful if you can post SQL for your example!).
Now you can update the results of a select to give what you want ...
SQL> update (select e.id_element, d.header header, e.insurer insurer
from t_debtor d, t_element e
2 where d.id_debtor = e.id_debtor 3
4 and d.header is not null)
5 set insurer = header;
set insurer = header
*
ERROR at line 5:
ORA-01779: cannot modify a column which maps to a non key-preserved table
This fails because the table is not key preserved, but a few constraints will solve this:
alter table t_element add constraint t_element_pk primary key (id_element) using index;
alter table t_debtor add constraint t_debtor_pk primary key (id_debtor) using index;
alter table t_element add constraint t_element_debtor_fk foreign key (id_debtor) references t_debtor(id_debtor);
Now the update will work, because the tables are key preserved:
SQL> update (select e.id_element, d.header header, e.insurer insurer
from t_debtor d, t_element e
where d.id_debtor = e.id_debtor
and d.header is not null)
set insurer = header 2 3 4 5 ;
2 rows updated.
SQL> select * from t_element;
ID_ELEMENT ID_DEBTOR INSURER
---------- ---------- ----------
1 1 something
2 2 else
3 3 bar