2012-02-23 12 views
3

テーブルに不足している行を挿入しようとしています。いずれかの列がOrderNumber(ソート番号)の場合、この列はテーブルのsIDに返されるOrderNumberの最大値の+1である必要があります。 sIDsの一部がSPOLテーブルに表示されないため、ステートメントの末尾にWHERE句があります。私はこのステートメントを再び実行しますが、sIDが現在テーブルに存在しないレコードに対してはOrderNumberを1に設定します。SELECTを使用してINSERT INTOを使用し、列に値を増やす

OrderNumberのプライマリキーに問題が発生しているため、sID + OrderNumberという以下の文は機能しません。

sIDの列に基づいて挿入される各行に対して、OrderNumberをどのようにして増やすことができますか?

INSERT INTO SPOL(sID, OrderNumber, oID) 
    SELECT   
     sID, OrderNumber, oID 
    FROM 
     (SELECT 
      sID, 
      (SELECT Max(OrderNumber) + 1 
      FROM SPOL 
      WHERE sID = TMPO.sID) AS OrderNumber, 
      oID 
     FROM TMPO 
     WHERE NOT EXISTS (SELECT * FROM SPOL 
         WHERE SPOL.oID = TMPO.oID) 
    ) AS MyData 
    WHERE 
     OrderNumber IS NOT NULL 

答えて

1

アイデンティティ列を使用したデータベース設計でこれを処理する方がはるかに優れています。スキーマを変更できるかどうかは言及していませんが、必要がない場合はクエリが多くなりますあなた自身でそれを管理する。

SQL Server管理スタジオのOrderNumber列のIDプロパティをonに設定できますが、生成するスクリプトは新しい仕様のテーブルを複製し、Identity_Insertで既に取得した値を挿入し、それを置き換えるために一時テーブルの名前を変更します - これは、あなたが持っている行の数に応じて大量のオーバーヘッドを持っています。

それについて移動するための最も効率的な方法は、おそらくです:

  1. は、元の列
  2. は、新しい名前を変更する名前の変更値
  3. 全体
  4. コピーのIDプロパティを持つ追加の列を作成します元のOrderNumber列を削除します。

これが終わったら、それはやっています。むしろあなたの挿入ステートメントは、単にこのような何かを言ったのではないでしょうか:

INSERT INTO SPOL (sID, oID) 
SELECT sID, oID, 
FROM TMPO 
WHERE OrderNumber IS NOT NULL 
+0

いいえスキーマを変更できません。うまくいけば、欠落しているものに対する1つの挿入クエリであるはずです。 – mheptinstall

0

アイデンティティ(1,1)を使用して列番号を増やすと、作業が簡単になります。

+1

ok sir tombom。、ll learn ..!プレゼンテーションではなくコンテンツに集中することをお勧めします。 –

関連する問題