2017-01-06 27 views
1

これは簡単だと思っていましたが、私はこれを頭に置くことができません。私はpl/sqlを避けたい、できればこれをプレーンなSQLで行うことが望ましい。だから以下のSQLでは、私はagreement_tblに挿入しようとしている、別のテーブルemployee_agreementから選択しています。従業員同意表は約6000行を返します。したがって、各行の挿入には、AGREEMENT_NBR列に挿入された一意のmax(agreement_nbr)+ 1が必要です。オラクルは同じテーブルにselect max + 1を挿入します

問題は、sqlが最初に実行されるため、max(agreement_nbr)は常に5000と同じですが、max(agreement_nbr)を挿入しようとすると値5000を挿入しようとすると 'Unique constraint exception'すべての6000個のインサートについて。選択クエリから各行に対してユニークなmax + 1を取得するにはどうすればよいですか?これはおそらく、同じテーブルからの挿入と選択に似ています。どんな助けもありがとうございます。ありがとう

編集:これは1回限りのスクリプトで、agreement_tblには既に何千ものレコードが設定されています。

INSERT 
INTO 
    Agreement_tbl 
    (
     AGREEMENT_NBR, 
     Employee_id, 
     AGREEMENT_TEXT 
    ) 
     select    
     (select max(AGREEMENT_NBR)+1 from Agreement_tbl) as AGREEMENT_NBR, 
      a.Employee_id , 
     a.AGREEMENT_TEXT 
    from employee_agreement 
     -- some where conditions 
+4

ですか? –

+3

'SEQUENCE'を使用してください。あなたの 'max(AGREEMENT_NBR)+ 1'の解決策は、一度に複数のユーザに対しては機能しません。 –

+1

これを行うために、シーケンスがはるかに優れており、より信頼性の高い方法です。これにより、将来の挿入のためにテーブルの現在の順序が維持されます。それ以外にも、元のアプローチを継続したい場合は...「Agreement_tbl」は現在空ですが、このメソッドを使用して値を入力しようとしていますか?これがこの表を埋めるための1回のDMLの場合、これは順序がソリューションに値を追加しない可能性があります。 – gmiley

答えて

3

+1の代わりにrownumを使用してください。シーケンスを使用しない理由
ROWNUMは、1行目の1、第などのための2:

INSERT 
INTO 
    Agreement_tbl 
....... 
     select    
     rownum + (select max(AGREEMENT_NBR) from Agreement_tbl) as AGREEMENT_NBR, 
      a.Employee_id , 
     a.AGREEMENT_TEXT 
    from employee_agreement 
     -- some where conditions 
+0

ありがとう。私はこれを試してみたと思ったが、私の悪い私は最大のサブクエリの中に+ rownumを持っていたので、動作しなかった。それは今、感謝します –

関連する問題