0

もう一度問題が発生しました:D最初に少し情報があります:あるテーブルから別のテーブルにデータをコピーしようとしています(構造は同じです)。ここで、1つのセルをインクリメントする必要があります。グループごとに1から始まります(履歴のように)。

私はこのテーブルを持っています:

create table My_Test/My_Test2 (
my_Id Number(8,0),
my_Num Number(6,0),
my_Data Varchar2(100));

(my_Id、my_NumはネストされたPKです)

新しい行を挿入する場合は、の値がmy_idすでに存在するかどうかを確認する必要があります。
これが当てはまる場合はmy_Num、このIDに次を使用する必要があります。

私は私のテーブルにこれを持っています:

My_Id   My_Num    My_Data
1       1         'test1'
1       2         'test2'
2       1         'test3'

ここで1の行を追加するmy_Idと、行は次のようになります。テーブルにこれがあります。

My_Id   My_Num    My_Data
1       3         'test4'

これは非常に簡単に聞こえますが、SQLで作成する必要があり、SQL Serverでも同じ問題が発生し、これを使用しました。

Insert Into My_Test (My_Id,My_Num,My_Data)
SELECT my_Id,
  (
    SELECT
      CASE (
          CASE MAX(a.my_Num)
            WHEN NULL
            THEN 0
            Else Max(A.My_Num)
          END) + b.My_Num
        WHEN NULL
        THEN 1
        ELSE (
          CASE MAX(a.My_Num)
            WHEN NULL
            THEN 0
            Else Max(A.My_Num)
          END) + b.My_Num
      END
    From My_Test A
    where my_id = 1
  )
  ,My_Data
From My_Test2 B
where my_id = 1;

副選択で行が見つからない場合、この選択はnullを返します

ケースでmaxを使用できるようにする方法はありますか?nullを返す場合は、0または1を使用する必要がありますか?

編集:今これを使用しています:

Insert INTO My_Test  ( My_Id,My_Num,My_Data )
SELECT B.My_Id,
  (
    SELECT COALESCE(MAX(a.My_Num),0) + b.my_Num
    FROM My_Test A
    Where a.My_Id = b.My_Id)
  ,b.My_Data
FROM My_Test2 B
WHERE My_Id = 1

THXからバーラトとOMGポニーへ


オーロに挨拶

4

3 に答える 3

0

これを試してみてください

Insert Into My_Test (My_Id,My_Num,My_Data)
SELECT my_Id,(
    SELECT MAX(NVL(My_Num,0)) + 1     
    From My_Test 
    where my_id = b.my_id
  )
,My_Data
From My_Test2 B
where my_id = <your id>;
于 2010-06-07T14:45:22.427 に答える
0
Insert Into My_Test (My_Id,My_Num,My_Data) 
select My_id,coalesce(max(My_num),0),'test4' from My_Test
where My_id=1
group by My_id
于 2010-06-07T14:46:21.537 に答える
0

すべてのソリューションには、マルチユーザー環境では機能しないという問題があります。2つのセッションがその挿入ステートメントを同時に発行すると、両方が同じ(my_id、my_num)の組み合わせを取得し、そのうちの1つがORA-00001の一意性制約違反で失敗します。したがって、マルチユーザー環境でこれを機能させる必要がある場合は、主キー列を1つだけ使用し、それにシーケンスを入力することをお勧めします。my_id列も保持します。これは、一種のグループ化列または外部キー列です。エンドユーザーが(Web)アプリケーションの「my_num」列を本当に見たい場合は、row_number分析関数を使用できます。

このシナリオの詳細については、私のブログ投稿をご覧ください: http ://rwijk.blogspot.com/2008/01/sequence-within-parent.html

よろしく、ロブ。

于 2010-06-09T06:41:39.570 に答える