Sql server 对于以下场景,如何在SQL server中通过一条update语句进行更新?

Sql server 对于以下场景,如何在SQL server中通过一条update语句进行更新?,sql-server,Sql Server,对于以下场景,如何通过一条update语句进行更新? 我有两张桌子。表A包含以下字段: 测试编号,CO,CO2,N20,CH4 TestNumber列的值是1,2,3 TableA TestNumber CO CO2 N2O CH4 1 2

对于以下场景,如何通过一条update语句进行更新? 我有两张桌子。表A包含以下字段: 测试编号,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        
我使用了一段代码,比如declare table variable。然后将数据从TableB存储到table变量。然后设置rowCount=1,然后循环并删除一行,并更新工作正常的TableA。我得到了预期的结果。但我相信我可以直接执行UPDATE命令,而不需要太多的表变量声明和循环。我正在更新,但不是直接更新

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


回复:

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

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循环中

尝试以下操作:

您可以使用
PIVOT
TableB
转换为与
TableA
相同的格式,将
TestIdentifier
作为
TableB

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

对于完整的解决方案,请尝试

您的意思是像
更新TableA set CO=TableB.TestValue from TableB,其中TableA.TestNumber=TableB.TestNumber和TableB.TestIdentifier='CO'
,对每种化合物重复一次?非常感谢您的帮助