更新表:在oracle中将结果从一行复制到另一行

时间:2017-09-06 14:11:09

标签: sql oracle sql-update

我在更新表格中的数据时遇到以下问题。

首先是数据库的结构。

我有2张桌子。

表1: 投票:专栏:PKID,RESULT,USAGE,GROUP

  • 对于每种用法,组必须投票,结果将保存在此表中。

表2: 用法:列:PKID,STATUS,SOURCE

  • 每个用法都有一个状态,有些用法有源用法,但可以为null。

现在我需要迁移我的数据。我想将某些投票的某些结果复制到投票表中的其他一些投票中。

这里我被卡住了......

用例如下: 状态4中使用的每个投票(我称之为活动)和组b应该得到组b的投票结果,该投票结果与源4是状态4中的使用(活动使用)的用法绑定。

这些是我想要插入的结果:

select v2.result from votings v2
join usage us on us.pkid = v2.usage
where us.status=10 and us.source in (
    select v3.usage from votings v3
    join usage us2 on us2.pkid = v3.usage 
    where us2.status = 4 and v3.group = v2.group)

但是现在我无法将这些结果链接到正确的行...
这是一个例子:

example merge

1 个答案:

答案 0 :(得分:1)

如果我理解了一切你需要merge类似于此:

merge into votings v
using (select u2.pkid usid, vt.grp, vt.result 
         from votings vt 
         join usage   u1 on vt.usage  = u1.pkid and u1.status = 10
         join usage   u2 on u2.source = u1.pkid and u2.status =  4
        ) s
on (v.usage = s.usid and v.grp = s.grp)
when matched then update set result = s.result

测试数据:

create table votings(PKID varchar2(3), RESULT int, USAGE varchar2(3), GRP varchar2(2));
insert into votings values ('V01', 23, 'U01', 'B');
insert into votings values ('V02', 17, 'U02', 'B');
insert into votings values ('V03',  9, 'U04', 'C');
insert into votings values ('V04',  3, 'U04', 'B');

create table usage (PKID varchar2(3), STATUS int, SOURCE varchar2(3));
insert into usage values ('U01', 10, null);
insert into usage values ('U02', 10, null);
insert into usage values ('U04',  4, 'U01');

关键3的更新值V04已替换为23(关键V01)。