如何从不同表的相同列值更新表的列值?

时间:2016-02-26 11:59:21

标签: sql

我有两张桌子。

模板表。(templ_idobj_id是主键)

templ_id    obj_id

TP000002    PE554959
TP000003    PE555867
TP000006    PE555102
TP000009    PE554994
TP000009    PE554956
TP000009    PE555176
TP000009    PE555598
TP000009    PE555256
TP000010    PE555297
TP000010    PE555286

业务表。(bsn_no是主键)

bsn_no    obj_id     templ_id
1         PE554959   null
2         PE555867   null
3         PE555102   null
4         PE554994   null
5         PE554956   null
6         PE555176   null
7         PE555598   null
8         PE555256   null
9         PE555297   null
10        PE555286   null

我想使用单个更新查询基于templ_id从模板表templ_id更新业务表obj_id

3 个答案:

答案 0 :(得分:1)

您可以使用相关子查询执行此操作:

update bsn_no
    set templ_id = (select t.templ_id
                    from template_table t
                    where t.obj_id = bsn_no.obj_id
                   );

这是标准SQL,应该可以在任何数据库中使用(尽管如果obj_id中有重复的template_table,它将返回错误)。特定数据库具有用于组合update中的表的其他语法。

编辑:

如果返回多行,最简单的解决方案是聚合,不用 group by或使用where rownum = 1

update bsn_no
    set templ_id = (select t.templ_id
                    from template_table t
                    where t.obj_id = bsn_no.obj_id and rownum = 1
                   );

这可以通过选择(任意)匹配值来避免错误。

答案 1 :(得分:1)

UPDATE BusinessTable
SET BusinessTable.templ_id = (SELECT TemplateTable.templ_id
                               FROM TemplateTable
                               WHERE BusinessTable.obj_id = TemplateTable.obj.id )

如果ID相同,您可以对子查询进行分组:

UPDATE BusinessTable
SET BusinessTable.templ_id = (SELECT TemplateTable.templ_id
                               FROM TemplateTable
                               WHERE BusinessTable.obj_id = TemplateTable.obj.id 
                               GROUP BY Template.templ_id
                               )

答案 2 :(得分:0)

UPDATE BT
SET templ_ID = TT.templ_ID
FROM [Business Table] BT
INNER JOIN [Template Table] TT ON BT.obj_id = TT.obj_id