2017-10-11 8 views
-1

2つのテーブルがあります。最初のテーブルのレコードに基づいて2番目のテーブルを挿入または更新し、INVE_KEY,EVEN_KEY(両方の組み合わせが一意である必要があります)を挿入または更新する必要があります。最初のテーブルの行に基づいて、2番目のテーブルの行を挿入または更新します。

最初の表= @

第テーブルTBL1 = @

例1 TBL2:

2番目の表はalredy INVE_KEY = 1、EVEN_KEY = 2、及び第一テーブルが INVE_KEYを有している場合= 1、EVEN_KEY = 2、この行は2番目のテーブル(列 QUA)でのみ更新されます。

例2:

第二テーブルはINVE_KEY = 3、EVEN_KEY = 1を持っていない場合、この行は 最初のテーブルから2番目のテーブルに挿入されます。

私の問題は、テーブルからテーブルへの挿入方法と、それぞれのレコードが2番目のテーブルに存在するかどうかを確認することができないことです。

最初の表:

+----------+----------+-----+ 
| INVE_KEY | EVEN_KEY | QUA | 
+----------+----------+-----+ 
|  1 |  1 | 3 | 
|  2 |  1 | 4 | 
|  3 |  1 | 5 | 
|  4 |  1 | 6 | 
+----------+----------+-----+ 

二番目の表:

+----------+----------+-----+ 
| INVE_KEY | EVEN_KEY | QUA | 
+----------+----------+-----+ 
|  3 |  1 | 0 | 
|  4 |  1 | 0 | 
+----------+----------+-----+ 

第二のテーブルを更新し、期待される結果後:両方のテーブルの

+----------+----------+-----+ 
| INVE_KEY | EVEN_KEY | QUA | 
+----------+----------+-----+ 
|  1 |  1 | 3 |(inserted) 
|  2 |  1 | 4 |(inserted) 
|  3 |  1 | 5 |(updated QUA) 
|  4 |  1 | 6 |(updated QUA) 
+----------+----------+-----+ 

作成とデータ:

declare @tbl1 table 
      (
      INVE_KEY INT, 
      EVEN_KEY INT, 
      QUA INT 
     ) 

      declare @tbl2 table 
      (
      INVE_KEY INT, 
      EVEN_KEY INT, 
      QUA INT 
     ) 


      insert into @tbl1(inve_Key, even_Key, qua) 
      values(1, 1, 3),(2,1,4),(3,1,5),(4,1,6) 

      insert into @tbl2(inve_Key, even_Key, qua) 
      values(3,1,0),(4,1,0) 
+0

は2文でそれを行う試してみてください。まず、既存のレコードを更新します(UPDATE FROM構文についてはGoogleに問い合わせてください)。 2番目 - >不足しているレコードを挿入 –

+0

最初に2番目のテーブルを切り捨て、最初のテーブルの期待される結果をテーブル全体に取り込むのはなぜでしょうか? –

+0

MERGEを見ましたか? https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql –

答えて

1

が、これは

MERGE INTO TargetTable AS TargetTable 
    USING SourceTable AS SourceTable 
    ON (TargetTable.INVE_KEY = SourceTable.INVE_KEY) -- business keys only 
    and (TargetTable.EVEN_KEY = SourceTable.EVEN_KEY) 
    -- Insert the new rows 
    WHEN NOT MATCHED -- New records 
    THEN 
    INSERT (INVE_KEY, 
      EVEN_KEY, 
      QUA 

      ) 
    VALUES 
    (  SourceTable.INVE_KEY, 
      SourceTable.EVEN_KEY, 
-- Updates 

    WHEN MATCHED AND (TargetTable.QUA <> SourceTable.QUA 
      ) THEN 

    UPDATE SET 
    TargetTable.QUA = SourceTableQUA ; 
+0

魅力的なように動作します:)おそらくあなたはこれに関する文書の良いリンクを持っていますか? – FrenkyB

+0

MERGEステートメントを使用することは推奨されません。その代わりにINSERT/UPDATEを使用する方がよいでしょう。 MERGE構文は非常に難しく、修正されていないバグもいくつかあります。他の方法では、ほとんどの場合パフォーマンスには効果がありません –

+0

あなたはよりよい提案をしていますか?私が考えることができるのはカーソルです。これはマージよりも悪いことです。マージしないと、代わりにカーソルを使用します。あなたはその特定の例のコードをマージを使用しないで表示できますか? – FrenkyB

関連する問題