0

对于以下情况,如何通过一个 UPDATE 语句进行更新?我有 2 张桌子。TableA 包含以下字段:TestNumber、CO、CO2、N20、CH4,TestNumber 列的值为 1、2、3

TableA

TestNumber      CO      CO2     N2O     CH4  
 1                                                              
 2                                                              
 3  

第二个名为 TableB 的表包含以下字段:TestNumber、TestIdentifier、TestValue,其值如下:

TableB

TestNumber      TestIdentifier  TestValue      
 1                 CO           12.3   
 1                 CO2          10     
 2                 CO           9.8    
 2                 N20          45     
 3                 CO           12.5   
 3                 CO2          13.0  

我期望结果为:

TestNumber      CO      CO2     N2O     CH4   
 1              12.3    10                                             
 2              9.8             45                                     
 3              12.5    13.0        

我使用一大块代码来做到这一点,比如声明表变量。然后将 TableB 中的数据存储到表变量中。然后 SET rowCount =1 然后循环并删除一行并更新工作完美的 TableA。我得到了我的预期结果。但我相信我可以直接执行 UPDATE 命令,而无需过多的表变量声明和循环。我正在更新,但不是直接更新。

我想学习如何在不循环的情况下直接更新。

回复:

4

2 回答 2

1

尝试这个 :

您可以使用与具有的列名相同的形式PIVOT转换TableBTableATestIdentifierTableB

Select TestNumber ,[Co],[CO2],[N2O],[CH4]
FROM
   ( Select TestNumber,TestIdentifier,TestValue from TableB) as sourceTable
pivot 
   (
    sum(TestValue) 
    for TestIdentifier in ([Co],[CO2],[N2O],[CH4])
   )
as pvt 

现在您可以简单地使用内部连接TestNumber并更新TableA

Update t
set t.Co=cte.CO,
t.CO2=cte.CO2,
t.N2O=cte.N2O,
t.CH4=cte.CH4
from TableA as t
inner join cte 
on cte.TestNumber=t.TestNumber

完整的sql查询是

;With cte (TestNumber ,[Co],[CO2],[N2O],[CH4])
 as
 (
  Select TestNumber ,[Co],[CO2],[N2O],[CH4]
  FROM
      ( Select TestNumber,TestIdentifier,TestValue from TableB) as sourceTable
  pivot 
      (
       sum(TestValue) 
       for TestIdentifier in ([Co],[CO2],[N2O],[CH4])
      )
  as pvt
 )
  Update t
  set t.Co=cte.CO,
  t.CO2=cte.CO2,
  t.N2O=cte.N2O,
  t.CH4=cte.CH4
  from TableA as t
  inner join cte 
  on cte.TestNumber=t.TestNumber

要获得完整的解决方案,请尝试SQLFIDDLE

于 2012-10-31T06:34:29.897 回答
0

您可以阅读有关数据透视表的内容……也许会有所帮助。但是如果你的第一个表是静态的。我的意思是,它总是相同的列和相同的行,你可以这样做:

Update tableA set
CO = (Select sum(testValue) from TableB where testNumber = 1 and testIdentifier = 'CO'),
CO2 = (Select sum(testValue) from TableB where testNumber = 1 and testIdentifier = 'CO2'),
N20 = (Select sum(testValue) from TableB where testNumber = 1 and testIdentifier = 'N20'),
CH4 = (Select sum(testValue) from TableB where testNumber = 1 and testIdentifier = 'CH4')
where testNumber = 1

您可以为其他测试再写两次...或者如果它们是可变的..您可以在 while 循环中编写

于 2012-10-31T01:10:38.697 回答