我可以使用同一个表的另一个元组的相同属性更新元组的特定属性吗?如果可能,该算法应该是什么?

时间:2015-01-27 12:39:24

标签: algorithm plsql sql-scripts

假设我有一个包含10个记录/元组的表。现在我想用第一条记录的相同属性更新第6条记录的属性,第2条,第3条,第7条,第4条,第9条,第5条,第10条,即不使用光标/循环。允许使用任意数量的临时表。这样做的策略是什么?

2 个答案:

答案 0 :(得分:0)

PostgreSQL(可能还有其他RDBMS)允许您在UPDATE语句中使用自联接,就像在SELECT语句中一样:

UPDATE tbl
SET attr = t2.attr
FROM tbl t2
WHERE tbl.id = t2.id + 5
AND tbl.id >= 6

答案 1 :(得分:0)

使用update-with-join这很容易,但Oracle不这样做,而最接近的替代品可能非常难以开始工作。这是最简单的方法。它涉及一个子查询,用于获取where子句中的新值和相关子查询。它看起来很复杂,但set子查询应该是不言自明的。

where子查询实际上只有一个目的:它连接两个表,就像我们可以进行连接时on子句那样。除了主表中使用的字段(正在更新的字段)必须是关键字段。事实证明,在下面执行自我“连接”时,它们都是相同的字段,但它是必需的。

where子句添加到其他限制条件中,如图所示。

update  Tuples t1
    set t1.Attr =(
        select  t2.Attr
        from    Tuples  t2
        where   t2.Attr = t1.Attr - 5 )
where   exists(
        select  t2.KeyVal
        from    Tuples  t2
        where   t1.KeyVal = t2.KeyVal)
    and t1.Attr > 5;

SqlFiddle现在正在调整它,所以这里使用的数据是:

create table Tuples(
    KeyVal  int not null primary key,
    Attr    int
);

insert into Tuples
    select  1, 1 from dual union all
    select  2, 2 from dual union all
    select  3, 3 from dual union all
    select  4, 4 from dual union all
    select  5, 5 from dual union all
    select  6, 6 from dual union all
    select  7, 7 from dual union all
    select  8, 8 from dual union all
    select  9, 9 from dual union all
    select  10, 10 from dual;

表开头看起来像这样:

KEYVAL  ATTR
------  ----
     1     1
     2     2
     3     3
     4     4
     5     5
     6     6
     7     7
     8     8
     9     9
    10    10

有了这个结果:

KEYVAL  ATTR
------  ----
     1     1
     2     2
     3     3
     4     4
     5     5
     6     1
     7     2
     8     3
     9     4
    10     5