0

根据组的结果更新表

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

Table1 {pers_id, loc_id, pos, ... }

Table2 {pers_id, loc_id, pos, ... }

没有一个字段是唯一的。前两个字段共同将表(或表)中的记录标识为属于同一实体。Table1 可以有 15 条记录属于一个实体,而 table2 可以有 4 条记录属于同一实体。第三列“pos”是从 0 到任何值的索引,这是我要更新的列。

在 Table1 和 Table2 中,pos 列从 0 开始,并根据用户选择递增,因此在示例中(table1 中有 15 条记录,table2 中有 4 条记录),table1 包含 0 - 14 的 'pos' 值,而 Table2包含 0-3 的“pos”值。

我想用 Table2 中类似实体的计数结果来增加 Table1 中的 pos 字段。这是正确给我table2结果的sql语句:

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 等。

这可以在一个声明中实现吗?

4

2 回答 2

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)
于 2013-01-17T14:45:02.793 回答
0

是的,这是可能的,您可以对其中一些更新使用 MERGE,并且有一些方法可以将更新和子选择之间的值关联起来。我过去曾这样做过,但这很棘手,而且我没有现有的例子。

您可以在此站点上找到几个示例,一些用于 Oracle,一些用于其他数据库,只需稍作修改即可使用。

于 2013-01-17T14:19:13.933 回答