根据另一列的另一个值和/或另一行中的同一列更新设置值:-ORA 1427
Posted
技术标签:
【中文标题】根据另一列的另一个值和/或另一行中的同一列更新设置值:-ORA 1427【英文标题】:update set value based on another value of another column and/or same column in another row:-ORA 1427 【发布时间】:2017-03-09 12:13:57 【问题描述】:我正在尝试根据另一列中的通过或失败和/或前几周行中同一列的值将一列重置为零或增加 +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;
【问题讨论】:
我宁愿期待语法错误... 是的,我有一个“时间”而不是“地点”。但这与我在这里遇到的实际问题无关。is
仅用于NULL
,不适用于数字。对于数字,请使用 =
。在第二个select
之前使用in
而不是=
没错。同样,这不是我在原作中的错误。只是几个错别字。不过,关于“in”的观点很好。现在给它一个测试。
把=
改成in
后有没有试运行?
【参考方案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));
【讨论】:
【参考方案2】:条件返回多于 1 条记录的查询之一
【讨论】:
是的,这就是我从那个错误中假设的。 'where' 条件都可能有多个结果。我只是不知道如何强迫它只有一个结果。这里的“where”子句定义“Set”的右侧是否正确?因为那是我需要确保它引用前一周的 INCREMENT_COUNT 的地方【参考方案3】:这似乎已经完成了工作。 感谢您的帮助,它让我以不同的方式思考。
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);
【讨论】:
以上是关于根据另一列的另一个值和/或另一行中的同一列更新设置值:-ORA 1427的主要内容,如果未能解决你的问题,请参考以下文章