2017-10-11 76 views
-1

我有兩個表。我必須根據第一張表和INVE_KEY,EVEN_KEY(兩者的組合必須是唯一的)的記錄插入或更新第二張表。根據第一個表中的行插入或更新第二個表中的行

第一表= @ TBL1

第二表= @ TBL2

實施例1:

如果第二表alredy具有INVE_KEY = 1,EVEN_KEY = 2,和第一表具有 INVE_KEY = 1,EVEN_KEY = 2,比此行僅在第二個表中更新(列爲 QUA)。

實施例2:

如果第二表沒有INVE_KEY = 3,EVEN_KEY = 1,則該行會 被插入到從第一個表的第二表。

我的問題是,我不知道如何做從表到表的插入,並同時檢查每個記錄是否存在於第二個表中?

第一表:

+----------+----------+-----+ 
| 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語法);第二個 - >插入缺失的記錄 –

+0

爲什麼不只是先截斷第二個表格,然後用第一個表格的預期結果填充整個表格。 –

+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

相關問題