我对看似简单的 UPDATE 语句感到困惑。
我正在寻找使用两个值的更新。第一个 (a) 用于分组,第二个 (b) 用于查找相应组内的局部最小值。额外一点,b 上有一个阈值:任何 1 或更小的值都应保持原样。
drop table t1;
create table t1 (a number, b number);
insert into t1 values (1,0);
insert into t1 values (1,1);
insert into t1 values (2,1);
insert into t1 values (2,2);
insert into t1 values (3,1);
insert into t1 values (3,2);
insert into t1 values (3,3);
insert into t1 values (4,1);
insert into t1 values (4,3);
insert into t1 values (4,4);
insert into t1 values (4,5);
-- 1,0 -> 1,0
-- 1,1 -> 1,1
-- 2,1 -> 2,1
-- 2,2 -> 2,2
-- 3,1 -> 3,1
-- 3,2 -> 3,2
-- 3,3 -> 3,2 <-
-- 4,1 -> 4,1
-- 4,3 -> 4,3 <-
-- 4,4 -> 4,3 <-
-- 4,5 -> 4,3 <-
显然还不够的是:
update t1 x
set b = (select min(b) from t1 where b > 1)
;
无论我尝试什么更复杂的东西,例如
UPDATE t1 x
set (a,b) = (select distinct a,b from (
select a, min(b) from t1 where b > 1 group by a)
)
;
我明白了
SQL-Fehler: ORA-01427: Unterabfrage für eine Zeile liefert mehr als eine Zeile
01427. 00000 - “单行子查询返回多于一行”
这并不奇怪,因为 a 的每个值都需要一行。
当然,我可以编写带有游标循环的 PL/SQL 过程,但是在单个优雅的 SQL 语句中是否可能?也许使用分区方式?