根据组的结果更新表

时间:2013-01-17 14:13:56

标签: sql oracle

根据

的分组结果更新表格

我有一个棘手的更新问题,我正在努力解决。有两个表包含相同的三列以及其他不同的列,如下所示:

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等

这是否可以在单一声明中实现?

2 个答案:

答案 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,另一些用于其他数据库,稍作修改。