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