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

マージ更新オラクルは、安定した行のセットを取得できません

    このエラーの原因を示します。
    以下の簡単な例を検討してください。

    CREATE TABLE A_100(
      x_system int,
      val int
    );
    
    INSERT INTO a_100 values( 1, 100 );
    INSERT INTO a_100 values( 2, 200 );
    
    CREATE TABLE B_100(
      x_system int,
      val int
    );
    
    INSERT INTO b_100 values( 1, 1100 );
    INSERT INTO b_100 values( 2, 2000 );
    INSERT INTO b_100 values( 2, 3000 );
    
    commit;
    

    今、この参加を検討してください:

    SELECT *
    FROM A_100 a
    JOIN B_100 b
    ON a.x_system = b.x_system AND a.x_system = 1
    ;
    
    | X_SYSTEM | VAL | X_SYSTEM |  VAL |
    |----------|-----|----------|------|
    |        1 | 100 |        1 | 1100 |
    

    上記のクエリは、テーブルB_100から1つの一意のレコードを提供します 。マージステートメントでこの結合条件を使用すると、マージはエラーなしで実行されます:

    MERGE INTO A_100 a
    USING B_100 b
    ON ( a.x_system = b.x_system AND a.x_system = 1)
    WHEN MATCHED THEN UPDATE SET a.val = b.val
    ;
    
    1 row merged. 
    

    次に、以下の参加を検討してください:

    SELECT *
    FROM A_100 a
    JOIN B_100 b
    ON a.x_system = b.x_system AND a.x_system = 2
    ;
    
    | X_SYSTEM | VAL | X_SYSTEM |  VAL |
    |----------|-----|----------|------|
    |        2 | 200 |        2 | 2000 |
    |        2 | 200 |        2 | 3000 | 
    

    上記の結合、A_100からの1つのレコード B_100から2つのレコードを提供します 。

    上記の結合条件でMERGEを使用しようとすると、次のようになります。

    MERGE INTO A_100 a
    USING B_100 b
    ON ( a.x_system = b.x_system AND a.x_system = 2)
    WHEN MATCHED THEN UPDATE SET a.val = b.val
    ;
    
    Error report -
    ORA-30926: unable to get a stable set of rows in the source tables
    

    オラクルは単にあなたに言います:

    左側のテーブルからの1つのレコードのクエリは、右側のテーブルからの2000と3000の2つの値を返しました。
    右側のテーブルから左側のテーブルの単一のスカラーフィールドに2つの値を割り当てることはできません。これは不可能です。
    結合条件を変更して、右側のテーブルからそれぞれに1つの一意のレコードのみを与えるようにしてください。左の表に記録する




    1. MySQLで列サイズを変更する方法

    2. MySQLクエリでテキストを数値に変換する

    3. Laraveleloquentのsql_mode=only_full_group_byとの互換性を解決するにはどうすればよいですか?

    4. SQL Server Management Studio(SSMS)でテンプレートを使用する方法-SQL Server/TSQLチュートリアルパート16