根据
的分组结果更新表格我有一个棘手的更新问题,我正在努力解决。有两个表包含相同的三列以及其他不同的列,如下所示:
Table1 {pers_id, loc_id, pos, ... }
Table2 {pers_id, loc_id, pos, ... }
这些字段都不是唯一的。前两个字段共同将表(或多个表)中的记录标识为属于同一实体。表1可以有15个属于实体的记录,而table2可以有4个属于同一实体的记录。第三列'pos'是从0到任何值的索引,这是我要更新的列。
在Table1和Table2中,pos列从0开始,并根据用户选择递增,因此在示例中(table1中的15条记录和table2中的4条记录),table1包含0到14的“pos”值,和Table2包含'pos'值0-3。
我想用表2中类似实体的计数结果增加Table1中的pos字段。这是sql语句,它正确地给了我table2的结果:
select table2.pers_id, table2.loc_id, count(*) as pos_increment from table2 group by table2.pers_id, table2.loc_id;
更新的最终结果,在示例中(table1中的15条记录和table2中的4条记录),将是同一实体的Table1中的所有记录增加4(特定实体组的结果)。 0将更改为4,15到19等
这是否可以在单一声明中实现?
答案 0 :(得分:1)
由于您只需要增加pos
字段,解决方案非常简单:
update table1 t1
set t1.pos = t1.pos +
(select count(1)
from table2 t2
where t2.pers_id = t1.pers_id
and t2.loc_id = t1.loc_id)
答案 1 :(得分:0)
是的,这是可能的,您可以将MERGE用于其中一些upadtes,并且有一些方法可以在更新和子选择之间关联值。我过去做过这个,但它很棘手,我没有现成的例子。
您可以在此站点上找到几个示例,一些用于Oracle,另一些用于其他数据库,稍作修改。