我有两个表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
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次以替换代码?
答案 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')