sql >> データベース >  >> RDS >> Oracle

単一のクエリを使用して複数のテーブル列の値を更新する

    /** XXX CODING HORROR... */
    

    必要に応じて、更新可能なビューを使用できます。 。ベーステーブルのビューを作成し、このビューに「代わりに」トリガーを追加して、ビューを直接更新します。

    いくつかのテーブルの例:

    create table party (
        party_id integer,
        employee_id integer
        );
    
    create table party_name (
        party_id integer,
        first_name varchar2(120 char),
        last_name varchar2(120 char)
        );
    
    insert into party values (1,1000);   
    insert into party values (2,2000);
    insert into party values (3,3000);
    
    insert into party_name values (1,'Kipper','Family');
    insert into party_name values (2,'Biff','Family');
    insert into party_name values (3,'Chip','Family');
    
    commit;
    
    select * from party_v;
    
    PARTY_ID    EMPLOYEE_ID    FIRST_NAME    LAST_NAME
    1            1000           Kipper        Family
    2            2000           Biff          Family
    3            3000           Chip          Family
    

    ...次に更新可能なビューを作成します

    create or replace view party_v
    as
    select
        p.party_id,
        p.employee_id,
        n.first_name,
        n.last_name
    from
        party p left join party_name n on p.party_id = n.party_id;
    
    create or replace trigger trg_party_update
    instead of update on party_v 
    for each row
    declare
    begin
    --
        update party
        set
            party_id = :new.party_id,
            employee_id = :new.employee_id
        where
            party_id = :old.party_id;
    --
        update party_name
        set
            party_id = :new.party_id,
            first_name = :new.first_name,
            last_name = :new.last_name
        where
            party_id = :old.party_id;
    --
    end;
    /
    

    ビューを直接更新できるようになりました...

    update party_v
    set
        employee_id = 42,
        last_name = 'Oxford'
    where
        party_id = 1;
    
    select * from party_v;
    
    PARTY_ID    EMPLOYEE_ID    FIRST_NAME    LAST_NAME
    1            42             Kipper        Oxford
    2            2000           Biff          Family
    3            3000           Chip          Family
    


    1. T-SQLを使用してSQLServerデータベースのリカバリモデルを変更する方法

    2. グループ化された中央値の最良のアプローチ

    3. PostgreSQLでのヒント

    4. テーブルのID列の明示的な値は、列リストが使用され、IDENTITY_INSERTがONSQLServerの場合にのみ指定できます。