使用同一表中的数据更新表

时间:2013-11-08 15:36:08

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

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

基本上,我们在此表中有两种类型的数据,预算和预测,按客户,产品,会计年度和月份分摊。

数据样本如下:

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

用户基本上想要从一种DataType复制到另一种DataType。例如,将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'

我是否有正确的查询或错过了什么?

感谢。

1 个答案:

答案 0 :(得分:2)

我看起来对我好。但是要确保进行测试始终是个好主意。使用

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

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

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

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'

看全貌。