2017-03-09 82 views
-1

我正在尝试设置一列由+1根据通重置为零或增量或在另一个失败列和/或前一周行中同一列的值。更新设定值:1427 -ORa

有其必须与前周排在其他两个变量列。

表是这样的:

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; 
+2

我宁愿期待语法错误... – jarlh

+0

是啊,我有一个'当'而不是'在哪里'。但这与我在这里遇到的实际问题无关。 – Slingy

+1

“is”仅用于“NULL”,不用于数字。对于数字使用'='。第二'select'使用'in'而不是'=' – Nitish

回答

0

一个在条件返回超过1个记录

+0

是的,这就是我从错误中得出的结论。 “where”条件可能有多个结果。我只是不知道如何强制它只有一个结果。 它是正确的,这里的“其中”条款是确定的“设置”右边?因为这是我需要确保它指的是前一周的INCREMENT_COUNT – Slingy

1

Similarl你的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)); 
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);