使用行号更新计数

问题描述

每次在T1.VALUE上处理事务时,我想更新TABLE1中的计数。问题TABLE2包含T1.VALUE不止一次,我想在T1.COUNT_VAL中设置该计数

UPDATE TABLE1 T1
    SET
        T1.COUNT_VAL = nvl(T1.COUNT_VAL,0) + 1
WHERE
    T1.VALUE IN (
        SELECT 
            T2.VALUE,ROW_NUMBER() OVER(PARTITION BY T2.ID  ORDER BY T2.VALUE)
        FROM
            TABLE2 T2
        WHERE
          T2.VALUE_REF = 'HGV00005x'
    ORDER BY T2.ID,T2.VALUE
    );

我尝试了此操作,但出现如下错误

错误报告- sql错误:ORA-00907:缺少右括号 00907. 00000-“缺少右括号” *原因:
*动作:

解决方法

从子查询中删除最后一个ORDER BY子句,

ORDER BY T2.ID,T2.VALUE
,

您需要返回通过ROW_NUMBER()函数返回的第一个值,因此请在语句中用rn = 1进行过滤。此外,您只需要从子查询中带入一列value,因为在t1.value运算符之前只有一列IN作为对应对象:

UPDATE table1 t1
   SET t1.count_val = NVL( t1.count_val,0 ) + 1
 WHERE t1.value IN (
                    SELECT value
                      FROM
                      (
                        SELECT t2.*,ROW_NUMBER() OVER ( PARTITION BY t2.id ORDER BY t2.value ) 
                            AS rn
                          FROM table2 t2
                         WHERE t2.value_ref = 'HGV00005x'
                      )
                     WHERE rn = 1 
                    )

实际上,由于子查询中的ORDER BY而引起错误,即使它在那里可用,它也没有成功的目的,并且ORDER BY已在{{1}中使用}功能。

,

您要使用匹配的T2.VALUE的计数更新(递增)T1.VAL_COUNT吗?

update t1
set val_count = nvl(val_count,0) + ( select count(*)
                                     from t2
                                     where t1.value = t2.value
                                     and t2.value_ref = 'HGV00005x'
                                     group by t2.value
                                     )

正在db<>fiddle here上进行演示