【问题标题】:How do I UPDATE a field from another table如何更新另一个表中的字段
【发布时间】:2013-08-07 19:11:07
【问题描述】:

我有两张表,除了一张之外,它们的数据和字段都相同。我想更新缺少“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 表添加字段和数据的最佳方法是什么。

【问题讨论】:

    标签: tsql sql-server-2012-express


    【解决方案1】:

    首先设计表格并添加新字段。

    或者运行

    ALTER TABLE SalesData
    ADD SBCMP smallint NULL
    

    然后您可以使用 MERGE 来获取数据。

    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     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
    

    【讨论】:

    • 新表的设计方式与旧表相同,唯一的例外是添加了 [SBCMP]。
    • 我只想在它们匹配时更新 SBCMP。这样做可以吗?
    • @tsqln00b 您可以查看我更新的解决方案。我提供了 MERGE 和 UPDATE 解决方案。在这种情况下,MERGE 与 UPDATE 并没有太大的不同,在您想要 UPDATE、INSERT 或 DELETE 的情况下它更胜一筹,因为它只扫描表一次。
    • @tsqln00b 如果您告诉我应该使用哪些列进行 JOIN,我可以相应地编辑解决方案。
    • 我目前在 SalesDataNew 上没有 ID 字段。两个表之间的所有字段都相同,但 SBCMP 除外。我认为 SBLOC、SBCUST、SBITEM 和 SBORD 将是 JOIN 所独有的。我认为您在 UPDATE 解决方案中颠倒了表格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2011-02-15
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多