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

OracleDatabaseのJOIN構文を使用したUPDATE

    UPDATEステートメントの構文は次のとおりです。

    http://docs.oracle.com/cd/B19306_01 /server.102/b14200/statements_10007.htm

    ここで、dml_table_expression_clause は:

    ( subquery )に注意してください 上記の構文の一部です。

    subquery は、結合の更新を実行できるようにする機能です。

    最も単純な形式では、次のようになります。

    UPDATE (
       subquery-with-a-join
    )
    SET cola=colb
    

    参加を更新する前に、ここにリストされている制限を知っておく必要があります:

    https://docs.oracle.com/cd/B28359_01 /server.111/b28286/statements_8004.htm

    • 集合演算子
    • DISTINCTオペレーター
    • 集計関数または分析関数
    • GROUP BY、ORDER BY、MODEL、CONNECT BY、またはSTARTWITH句
    • SELECTリストのコレクション式
    • SELECTリストのサブクエリ
    • 読み取り専用で指定されたサブクエリ
    • Oracle Database管理者ガイドに記載されているように、いくつかの例外を除いて結合します

    また、更新可能なビューに関連する一般的なルール-ここ(セクション:Updating a Join View ):
    http:// docs .oracle.com / cd / B19306_01 / server.102 / b14231 / views.htm#sthref3055

    まず、結合を使用してサブクエリを作成できます:

    SELECT age 
    FROM ages a
    JOIN names m ON a.id = m.id
    WHERE m.name = 'Sally'
    

    このクエリは単に次の結果を返します:

           AGE
    ----------
            30
    

    これで、クエリの更新を試みることができます:

    UPDATE (
        SELECT age 
        FROM ages a
        JOIN names m ON a.id = m.id
        WHERE m.name = 'Sally'
    )
    SET age = age + 1;
    

    しかし、エラーが発生します:

    このエラーは、上記の制限の1つが満たされていないことを意味します(キー保存テーブル)。

    ただし、テーブルに主キーを追加する場合:

    alter table names add primary key( id );
    alter table ages add primary key( id );
    

    これで、更新はエラーなしで機能し、最終的な結果は次のようになります。

    select * from ages;
    
            ID        AGE
    ---------- ----------
             1         25
             2         31
             3         35
    



    1. MySQl、共有列と共通列による順序付けなしで2つのテーブルを結合/マージします

    2. 新しいインデックスを追加しても、MySQLのインデックスのカーディナリティが変更されないのはなぜですか?

    3. P_AAの呼び出しで引数の数またはタイプが間違っています

    4. org.postgresql.jdbc.PgConnection.createClob()を解決する方法はまだ実装されていません