2013-08-07 68 views
0

我有兩個表具有相同的數據和字段,除了一個。我想更新缺少字段'SBCMP'的表。這是我要的字段和數據添加到該表的定義:如何更新從另一個表中的字段

[dbo].[SalesData](
    [SBLOC] [varchar](3) NULL, 
    [SBCUST] [varchar](7) NULL, 
    [RMNAME] [varchar](30) NULL, 
    [IFPRVN] [varchar](6) NULL, 
    [SBITEM] [varchar](25) NULL, 
    [SBITD1] [varchar](50) NULL, 
    [SBDIV] [smallint] NULL, 
    [SBCLS] [smallint] NULL, 
    [SBQSHP] [smallint] NULL, 
    [AVC] [real] NULL, 
    [SBEPRC] [real] NULL, 
    [SBINV] [int] NULL, 
    [SBORD] [int] NULL, 
    [SBTYPE] [varchar](1) NULL, 
    [SBINDT] [datetime] NULL, 
[RMSTAT] [varchar](2) NULL 

其他表具有完全相同的表定義,除了它有場[SBCMP] [SMALLINT] NULL

我只會使用新表,但舊錶具有其他舊數據,而新數據則不是。

我只是想知道什麼是UPDATE的最佳方法添加字段和數據的表。

回答

2

首先設計表格並添加新的字段。

或者運行

ALTER TABLE SalesData 
ADD SBCMP smallint NULL 

然後你可以爲了得到數據的使用合併。

MERGE SalesData AS target 
USING (SELECT * FROM SalesDataNew) AS source 
     ON (target.IDField = source.IDField) 
WHEN MATCHED THEN 
    UPDATE SET SBLOC = source.SBLOC, 
       SBCUST = source.SBCUST , 
       RMNAME = source.RMNAME, 
       IFPRVN = source.IFPRVN , 
       SBITEM = source.SBITEM , 
       SBITD1 = source.SBITD1 , 
       SBDIV = source.SBDIV , 
       SBCLS = source.SBCLS , 
       SBQSHP = source.SBQSHP , 
       AVC = source.AVC, 
       SBEPRC = source.SBEPRC, 
       SBINV = source.SBINV , 
       SBORD = source.SBORD, 
       SBTYPE = source.SBTYPE, 
       SBINDT = source.SBINDT, 
       RMSTAT = source.RMSTAT , 
       SBCMP = source.SBCMP 
WHEN NOT MATCHED THEN 
    INSERT (SBLOC, 
       SBCUST , 
       RMNAME, 
       IFPRVN , 
       SBITEM , 
       SBITD1 , 
       SBDIV , 
       SBCLS , 
       SBQSHP , 
       AVC , 
       SBEPRC , 
       SBINV , 
       SBORD, 
       SBTYPE, 
       SBINDT, 
       RMSTAT, 
       SBCMP) 
    VALUES (source.SBLOC, 
       source.SBCUST , 
       source.RMNAME, 
       source.IFPRVN , 
       source.SBITEM , 
       source.SBITD1 , 
       source.SBDIV , 
       source.SBCLS , 
       source.SBQSHP , 
       source.AVC , 
       source.SBEPRC , 
       source.SBINV , 
       source.SBORD, 
       source.SBTYPE, 
       source.SBINDT, 
       source.RMSTAT 
       source.SBCMP) 

請記住,我在MERGE的ON子句中使用了一個名爲IDField的假想字段。這是虛構的,因爲不清楚哪張是桌子的ID。如果有兩列形成id,則應像在JOIN語句中那樣添加它們。

還有一件事是我已將新表命名爲SalesDataNew,因爲我不知道它的實際名稱。

MERGE是FULL OUTER JOINning這兩個表(稱爲目標和源)。然後,對於匹配的行,它正在執行UPDATE,對於不在源上的行進行匹配,而對目標不執行INSERT。在目標上執行UPDATE和INSERT。

當目標上有行但目標上沒有時(在這裏你通常會刪除),在目標上執行某些操作可能是可能的,但是這不在我認爲的範圍之內。 。

如果你只是想更新和不插入,然後上面是確定你(雖然你應該刪除WHEN NOT MATCHED THEN部分你也可以做直UPDATE

一個例子是:

UPDATE  SalesData 
SET  SBLOC = source.SBLOC, 
      SBCUST = source.SBCUST , 
      RMNAME = source.RMNAME, 
      IFPRVN = source.IFPRVN , 
      SBITEM = source.SBITEM , 
      SBITD1 = source.SBITD1 , 
      SBDIV = source.SBDIV , 
      SBCLS = source.SBCLS , 
      SBQSHP = source.SBQSHP , 
      AVC = source.AVC, 
      SBEPRC = source.SBEPRC, 
      SBINV = source.SBINV , 
      SBORD = source.SBORD, 
      SBTYPE = source.SBTYPE, 
      SBINDT = source.SBINDT, 
      RMSTAT = source.RMSTAT , 
      SBCMP = source.SBCMP 
FROM  SalesData target 
      JOIN SalesDataNew source 
       ON target.IDField = source.IDField 
+0

新的表被以同樣的方式設計爲舊錶,唯一的例外是除了[SBCMP]的。 – tsqln00b

+0

我只是想更新SBCMP何時匹配。這樣行不行,只是這樣做呢? – tsqln00b

+1

@ tsqln00b你可以查看我的更新的解決方案,我已經提供了MERGE和UPDATE解決方案,在這種情況下,MERGE不會太大租用的時間比UPDATE更長,並且在你想要更新,插入或刪除的情況下,它會更好,因爲它只掃描一次表。 –

相關問題