1

レポート ID とそれぞれの拡張コードを含む「レポート」というテーブルがあります。現在、例として、各 ID の拡張子は「TXT」のみです。既存の各レポート ID に新しい拡張子 ('RTF') を挿入しようとしています。これが私のコードです:

merge into report a
      using (select x.rpt_id as value1, 'RTF' as value2
             from report x
             where x.extension <> 'RTF') b
      on (a.rpt_id = b.value1)
when not matched then
      insert values (b.value1, b.value2);

エラーは発生しませんが、何も挿入されません...

4

1 に答える 1

2

ステートメントを実行する前にデータのサンプル(もちろんサンプルのみ)を投稿し、ステートメントを実行した後に目的のデータを投稿すると便利です。

あなたは次のようなものを探しているようですね

INSERT INTO report( rpt_id, extension )
  SELECT rpt_id, 'RTF'
    FROM report
   WHERE extension != 'RTF'

主キーが実際にはとの組み合わせに対する複合制約でrpt_idありextension、それぞれが拡張子のあるN個のレポートのテーブルを取得し、同じ拡張子が「RTF」のTXTN個の新しい行を作成することが目標である場合、これは機能します。 rpt_id

SQL> create table report(
  2    rpt_id number,
  3    extension varchar2(3),
  4    constraint extension_pk primary key( rpt_id, extension )
  5  );

Table created.

SQL> insert into report values( 1, 'TXT' );

1 row created.

SQL> insert into report values( 2, 'TXT' );

1 row created.

SQL> insert into report values( 3, 'TXT' );

1 row created.

SQL> insert into report values( 4, 'TXT' );

1 row created.

SQL> insert into report values( 5, 'TXT' );

1 row created.

SQL> select * from report;

    RPT_ID EXT
---------- ---
         1 TXT
         2 TXT
         3 TXT
         4 TXT
         5 TXT

SQL> insert into report( rpt_id, extension )
  2    select rpt_id, 'RTF'
  3      from report
  4     where extension != 'RTF';

5 rows created.

SQL> select * from report;

    RPT_ID EXT
---------- ---
         1 RTF
         1 TXT
         2 RTF
         2 TXT
         3 RTF
         3 TXT
         4 RTF
         4 TXT
         5 RTF
         5 TXT

10 rows selected.

発生しているエラーに基づいて、主キーがとの組み合わせで定義されていないように見えrpt_idますextension

于 2012-04-03T22:27:59.400 に答える