【问题标题】:Update table with data from same table使用同一表中的数据更新表
【发布时间】:2013-11-08 15:36:08
【问题描述】:

尝试编写查询以使用同一表中的数据更新表。

这个表中基本上有两种类型的数据,预算和预测,按客户、产品、财政年度和月份划分。

数据样本如下:

CustomerCosts
CustomerNo     Product     FiscalYear    Month    DataType    DataField    Q    R    G
CU01           REG         2014          1        Budget      Commission   10   2    20
CU01           REG         2014          1        Budget      Warehouse    5    5    25
CU01           REG         2014          2        Budget      Commission   30   1    30
CU01           REG         2014          2        Budget      Warehouse    12   2    24
CU01           REG         2014          1        Forecast    Commission   10   2    20
CU01           REG         2014          1        Forecast    Warehouse    5    5    25
CU01           REG         2014          2        Forecast    Commission   30   1    30
CU01           REG         2014          2        Forecast    Warehouse    12   2    24

基本上,用户想要从一种数据类型复制到另一种数据类型。例如,将 2014 年预算复制到 2014 年预测中。

我想出了这个查询,但是虽然它似乎可以工作,但行更新计数显示正在更新的行数超过了应有的数量。

UPDATE CustomerCosts 
SET CustomerCosts.Q = f.Q, 
CustomerCosts.R = f.R,
CustomerCosts.G = f.G
FROM CustomerCosts
JOIN CustomerCosts f
ON CustomerCosts.CustomerNo = f.CustomerNo AND 
CustomerCosts.Product = f.Product AND 
CustomerCosts.Month = f.Month AND 
CustomerCosts.DataField = f.DataField
WHERE CustomerCosts.FiscalYear = 2014 AND 
CustomerCosts.DataType = N'Forecast' AND 
f.FiscalYear = 2014 AND
f.DataType = N'Budget'

我的查询是否正确,还是我遗漏了什么?

谢谢。

【问题讨论】:

    标签: sql-server-2008 tsql sql-update


    【解决方案1】:

    我觉得还可以。但可以肯定的是,做一个测试总是个好主意。使用

    将表 CustomerCosts 复制到一个新的临时表中
    SELECT * INTO Test_CustomerCosts FROM CustomerCosts
    

    之后尝试更新(更改脚本使其适用于测试表)并查看结果。

    尝试修改您的查询以选择:

    select 
    CustomerCosts.*, f.*
    FROM CustomerCosts
    JOIN CustomerCosts f ON 
      CustomerCosts.CustomerNo = f.CustomerNo AND 
      CustomerCosts.Product = f.Product AND 
      CustomerCosts.Month = f.Month AND 
      CustomerCosts.DataField = f.DataField
    WHERE 
      CustomerCosts.FiscalYear = 2014 AND 
      CustomerCosts.DataType = N'Forecast' AND 
      f.FiscalYear = 2014 AND
      f.DataType = N'Budget'
    

    查看全貌。

    【讨论】:

    • 我做了,在我的测试表中有 20 条测试记录、8 条预算、8 条预测和 4 条不应该更新的记录。 QA 显示 10 行受影响,而应该只有 8 行。检查数据我没有看到除了应该更新的八行之外的任何其他行,但那额外的两行让我担心。
    • 你有 DataField - "Commission" 和 "Warehouse" - 这就是重复的原因。可能您还必须在 JOIN CLAUSE 或 WHERE CLAUSE 中添加该字段。
    • 正确,然后检查您是否有重复的行。哪个是您的主键。如果您有 2 个相等的行,那么在更新中您将看到 2 行而不是 1 行。所有其他似乎都很好,这就是在这种情况下我想到的事情。此外,当有初始表时,您可以检查计算是否正确。
    • 我检查了您的每一行(使用我发布的选择查询),发现每一行都有匹配项,行数为 10(10 行 x 2 = 20 行)。我唯一注意到的是你有 2 行 0。因为你没有 where 子句限制 0,你也将更新它们。
    猜你喜欢
    • 2011-07-13
    • 2013-12-23
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多