-1

我正在尝试根据另一列中的通过或失败和/或前几周行中同一列的值将一列设置为重置为零或增加+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;
4

3 回答 3

1

与您的 mySQL 示例类似,您可以在 oracle 中执行类似的操作。根据您的数据模型,这可能对您不起作用。我已经根据您的信息整理了一个粗略的基本版本,但是您没有提供有关您的数据模型的足够信息,并且您的表/别名/列名的可读性很差......

(更多关于这里的子查询更新-> https://docs.oracle.com/database/121/SQLRF/statements_10008.htm#i2067871

update 
    (select t01.increment_count, t01.flag, prev_date.prev_count
    from  table1 t01
    left join(select ID3, ID2, INCREMENT_COUNT as prev_count 
                from table1 t10 
              inner join table2  t2 on t10.ID2=t2.ID2     
              where ID1=ID_IN 
               and ID3=ID_IN3 
               and t10.WEEK=OLD_DATE) prev_date on t01.WEEK=NEW_DATE  and prev_date.ID2=t01.ID2 and t01.ID1=ID_IN
    where t01.ID1=ID_IN
    and t1.WEEK=NEW_DATE
    and prev_date.ID3=ID_IN3)
set INCREMENT_COUNT = if(FLAG is null, null, if(FLAG,0, IFNULL(prev_count,0)+1));
于 2017-03-09T14:58:17.987 回答
0

where 条件返回多于 1 条记录的查询之一

于 2017-03-09T12:46:33.520 回答
0

这似乎已经完成了这项工作。感谢您的帮助,它让我以不同的方式思考。

 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);
于 2017-03-09T16:13:04.327 回答