Oracle 基于另一列和/或另一行中同一列的另一个值更新设置值:-ORA 1427

Oracle 基于另一列和/或另一行中同一列的另一个值更新设置值:-ORA 1427,oracle,sql-update,ora-01427,Oracle,Sql Update,Ora 01427,我试图根据另一列中的通过或失败,和/或前几周行中同一列的值,将一列重置为零或增加+1 还有两个其他变量列必须与前几周行中的变量列相匹配 表类似于: WEEK | ID1 | ID2 | FLAG | INCREMENT_COUNT | -------------------------------------------------------- -------------------------------------------------------- 我一直

我试图根据另一列中的通过或失败,和/或前几周行中同一列的值,将一列重置为零或增加+1

还有两个其他变量列必须与前几周行中的变量列相匹配

表类似于:

WEEK  |   ID1   |   ID2   | FLAG   | INCREMENT_COUNT  |
--------------------------------------------------------


--------------------------------------------------------
我一直在努力让这一部分的程序发挥作用,到目前为止,我得到的最好结果是:

 ID_IN and ID_IN3 are passed in the procedure call
 OLD_DATE and NEW_DATE are set as the previous week and current week
----------------------------------------------------------------------         
update table1
set table1.INCREMENT_COUNT = CASE
                                 WHEN table1.FLAG is null then null
                                 WHEN table1.FLAG = 1 then 0
                                 WHEN table1.FLAG = 0 then (NVL(INCREMENT_COUNT,0)+ 1)
                                 END
where (select INCREMENT_COUNT
  from table1
  where WEEK=NEW_DATE
  and ID1=ID_IN
  and exists (select (1)
              from table2
              where table1.ID2=table2.ID2
              and table2.ID3=ID_IN3))
 =
(select INCREMENT_COUNT
  from table1
  where WEEK=OLD_DATE
  and ID1=ID_IN
  and exists (select (1)
              from table2
              where table1.ID2=table2.ID2
              and table2.ID3=ID_IN3));
当调用这个过程时,我得到了错误

ORA-01427:单行子查询返回多行

此外,在MySQL中,我可以这样做并使其工作

update table1 as t01
left join(select ID3, ID2, INCREMENT_COUNT as prev_count from table1 as t10 inner join table2 as t2 on t10.ID2=t2.ID2 where ID1=ID_IN and ID3=ID_IN3 and t10.WEEK=OLD_DATE) as prev_date on t01.WEEK=NEW_DATE and prev_date.ID2=t01.ID2 and t01.ID1=ID_IN

set t01.INCREMENT_COUNT = if(t1.FLAG is null, null, if(t1.FLAG,0, IFNULL(prev_date.prev_count,0)+1))
where t01.ID1=ID_IN
and t1.WEEK=NEW_DATE
and prev_date.ID3=ID_IN3;

where condition中的一个查询返回多条记录,与mySQL示例类似,您可以在oracle中执行类似操作。这可能不适用于您,具体取决于您的数据模型。我根据您的信息编写了一个粗略的基本版本,但是您没有提供足够的数据模型信息,而且您的表/别名/列名的可读性较差

(有关使用子查询更新的详细信息,请参见此处->)


这似乎完成了任务。 谢谢你的帮助,这让我有了不同的想法

 UPDATE TABLE1 T01

            SET INCREMENT_COUNT = CASE 
                                    WHEN T01.FLAG IS NULL THEN NULL
                                    WHEN T01.FLAG = 1 THEN 0
                                    WHEN T01.FLAG = 0 THEN (NVL((SELECT INCREMENT_COUNT 
                                                                        FROM TABLE1 T10
                                                                        WHERE T10.WEEK=OLD_DATE
                                                                        AND T01.WEEK=NEW_DATE
                                                                        AND T01.ID2=T10.ID2
                                                                        AND ID1=ID_IN),0)+ 1)
                                    END
            WHERE EXISTS (SELECT (1)
                      FROM TABLE2
                      WHERE TABLE1.ID2=TABLE2.ID2
                      AND TABLE2.ID3=ID_IN3);

我宁愿期待语法错误……是的,我有一个“when”而不是“where”。但这与我这里遇到的实际问题无关。
is
仅用于
NULL
,不用于数字。对于数字,请使用
=
。在第二次
之前,选择
中使用
,而不是
=
正确。不过,这也不是我在原著中的错误。只是几个打字错误。不过,关于“in”的说法很有道理。现在给它一个测试。在将
中的
=
更改为
后是否尝试运行?是的,这是我从该错误中假定的。“where”条件可能都有多个结果。我只是不知道如何强迫它只有一个结果。此处的where子句用于定义“集合”的右侧是否正确?因为这就是我需要确保它是指前一周的增量计数
 UPDATE TABLE1 T01

            SET INCREMENT_COUNT = CASE 
                                    WHEN T01.FLAG IS NULL THEN NULL
                                    WHEN T01.FLAG = 1 THEN 0
                                    WHEN T01.FLAG = 0 THEN (NVL((SELECT INCREMENT_COUNT 
                                                                        FROM TABLE1 T10
                                                                        WHERE T10.WEEK=OLD_DATE
                                                                        AND T01.WEEK=NEW_DATE
                                                                        AND T01.ID2=T10.ID2
                                                                        AND ID1=ID_IN),0)+ 1)
                                    END
            WHERE EXISTS (SELECT (1)
                      FROM TABLE2
                      WHERE TABLE1.ID2=TABLE2.ID2
                      AND TABLE2.ID3=ID_IN3);