What is wrong with my update statement with a join in Oracle?

后端 未结 8 1487
梦谈多话
梦谈多话 2021-01-02 20:29

I am working with an Oracle 10g Database.

I have the following two tables:

T_DEBTOR :
    - ID_DEBTOR
    - HEADER
T_ELEMENT :
    -         


        
8条回答
  •  余生分开走
    2021-01-02 20:51

    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
    

提交回复
热议问题