基于两个表的多个UPDATE查询

时间:2019-12-16 14:36:06

标签: sql sql-server

我有两个表def update_values(A, B): b_by_name = {b.name: b for b in B} return [a._replace(city=b.city, state=b.state, river=b.river) if b is not None else a for a in A for b in [b_by_name.get(a.name)]] tbl_A

tabl_B除其他列外,还有160列,以160种不同的代码(例如, EEEPS29E

tb1_A,有一列代码,每个代码都有一个值:这些代码与tbl_B中的160个代码相对应。

两个表都有一个ID,可用于将它们链接在一起。我需要用tbl_A

中的值更新160 tbl_A

我有一个查询,如下所示:

tbl_B

我需要将此查询更改160次,将上面的代码UPDATE tbl_A SET EEEPS29E= COALESCE (tbl_B.value,0) FROM tbl_A LEFT JOIN tbl_B ON tbl_A.ID = tbl_B.ID WHERE tbl_B = 'EEEPS29E' 替换为其他160个代码之一。

是否可以在一个查询中执行此操作,还是只需要重复查询160次以替换代码?

2 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,您想用表B中的组合值(按其代码列分组)来更新表A中的列吗?您可以使用group by并删除where。像这样:

更新tbl_A SET EEEPS29E =浓缩(tbl_B.value,0) 来自tbl_A左加入 (SELECT ID,CodeColumn,COALESCE(value,0)来自tbl_B GROUP BY ID,tbl_B.CodeColumn)B

打开tbl_A.ID = B.ID

答案 1 :(得分:0)

如果您已经知道列,则可以透视表,并且它不会改变。

select
* 
from (values ('col1', '1000'), ('col2', '12'), ('col3', '12')) V(colname, val)
PIVOT (
max(val)
for colname in([col1], [col2], [col3])
) as pivoted

但可能确实是动态的,因此您必须使用从INFORMATION_SCHEMA.COLUMNS收集的列/表信息来动态创建SQL语句

类似

select 'update table_a set ' +
(select STRING_AGG(column_name + ' = (select value from table_b where id = table_a.id and col = '''+column_name+''')' , ' ,')
from INFORMATION_SCHEMA.COLUMNS
where table_name = 'table_a')