2016-08-21 11 views
2

CustDetailsというテーブルを持つCustomerというデータベースがあります。表のデータは以下のようになります(簡潔にするために一部を削除しました)。 IDがPKです。SQL Serverテーブルから同じテーブルにデータをコピー

CustDetails:私はテーブルを持っている同じサーバー上Claimと呼ばれる別のデータベースを、持っている

ID CustNo Year StatusId 
-------------------------- 
1 1231 2015 1 
2 1232 2015 2 
3 1233 2015 2 
4 1234 2014 1 
5 1235 2014 2 

呼ばClaimDetails(表が同じDBが、していない理由を私に聞かないでください私はボード上で来て、私は変更することができますものではありません前に、設計上の決定がなされました。)

データは以下と同様です(再度の一部を簡潔にするため削除)

ClaimDetailsは:

ID ClaimNumber CustNo 
---------------------- 
1 1   1231 
2 2   1232 
3 3   1236 
4 4   1237 

私は達成するために、いくつかのものを持っている:2016

  • に年を年は2015年であるCustDetailsから

    1. コピーすべての行をし、変更した場合の結果でステータスパート1は2で、2016の場合は1に設定します
    2. CustNoのネガティブリストを作成してClaimDetailsテーブルにありますが、には含まれていません表 - 2016年

    にこれらのためにCustDetailsテーブルに新しい行を作成し、3にステータスを設定し、年間だから私は最終的な結果上記したデータのために私が達成したいです:

    CustDetails

    ID CustNo Year StatusId 
        -------------------------- 
        1 1231 2015 1 
        2 1232 2015 2 
        3 1233 2015 2 
        4 1234 2014 1 
        5 1235 2014 2 
        6 1231 2016 1 
        7 1232 2016 1 
        8 1233 2016 1 
        9 1236 2016 3 
        10 1237 2016 3 
    

    これまでのところ、私はこのクエリを持っている:

    insert into CustDetails (CustNo, Year, StatusId) 
        select 
         CustNo, 2016, StatusId 
        from 
         CustDetails 
        where 
         Year = 2015 
    

    これは私が上記のクエリでパート2のための場所でのロジックを持っていないと私はちょうど行うことができると思いパート1をカバー:

    再び
    UPDATE CustDetails 
    SET StatusId = 1 
    WHERE Year = 2016 AND StatusId = 2 
    

    私はクエリが一部3のために行われていません

    SELECT CustNo 
    FROM ClaimDetails 
    WHERE CustNo NOT IN (SELECT CustNo FROM CustDetails) 
    

    そして個々CUSTNOのIDに作成するのです:私は私のような何かを行うことによってCustDetailsClaimDetailsではなくであるCustNo年代を得ることができます考えています。

    質問は、これを行うための最良の方法ですか、最初に一時テーブルへのコピーのようなことをする必要がありますか?そして、2つの別々のDBであっても、3番目の部分のクエリは正常に動作しますか?DBが正常に動作するかどうかを確認する限り、同じサーバーにあるかどうかはわかります。

  • +0

    @parfait - 私はこのことについて私の質問で言いましたが、それは私が変更を支配していない –

    答えて

    3

    実際には2番目のクエリでは、1番目のクエリの実行前に既に存在していた古いデータも更新されます。

    INSERT INTO CustDetails (CustNo, Year, StatusId) 
    SELECT CustNo, 2016, CASE WHEN StatusId = 2 THEN 1 ELSE StatusId END 
    FROM CustDetails 
    WHERE Year = 2015 
    

    第三クエリがINSERT INTO SELECTを使用しても同様に行うことができます:

    INSERT INTO CustDetails (CustNo, Year, StatusId) 
    SELECT CustNo, 2016, 3 
    FROM ClaimDetails 
    WHERE CustNo NOT IN (SELECT CustNo FROM CustDetails) 
    

    あなたが完全としてスキーマ名を含むのDBを修飾する必要がありますので、私はこのような場合を使用することをお勧め複数データベースクエリの場合は DatabaseName.SchemaName.TableNameです。

    関連する問題