ORACLE UPDATE SAME TABLE

时间:2018-09-16 18:26:44

标签: sql oracle sql-update

在同一表上通过应用条件(除符号以外)来更新一组数据时出现错误。有人可以帮我吗。

下面是我的Oracle查询-

List

以下错误-

  

SQL错误:

     

ORA-01427 :单行子查询返回多个行   01427. 00000-“单行子查询返回多个行”   *原因:
  *动作:

2 个答案:

答案 0 :(得分:3)

首先进行一些家庭作业;请不要调用您的表TABLE(Oracle会抱怨)。另外,您的子查询没有任何意义:

(SELECT TRUNC(COLUMN4) 
          FROM TABLE 
         WHERE COLUMN3 = 'Y' AND COLUMN4 = 'Y')

如果COLUMN4 = 'YTRUNC(COLUMN4)是什么意思?

但是我想这是您的意思(添加了示例数据)

create table TAB  as
select 1  COLUMN1, 'Y' COLUMN2, 'N' COLUMN3, sysdate-1 COLUMN4 from dual union all
select 2  COLUMN1, 'Y' COLUMN2, 'Y' COLUMN3, sysdate COLUMN4 from dual union all
select 2  COLUMN1, 'Y' COLUMN2, 'Y' COLUMN3, sysdate COLUMN4 from dual;

UPDATE TAB  
   SET COLUMN1 = 1 
 WHERE COLUMN2 = 'Y' 
   AND COLUMN3 = 'N' 
   AND TRUNC(COLUMN4)  <
       (SELECT TRUNC(COLUMN4) 
          FROM TAB  
         WHERE COLUMN2 = 'Y' AND COLUMN3 = 'Y');

哪个导致

  

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

问题是,如果您想将一个数字与一组数字进行比较,则<只能比较两个数字(=带有更多行的子查询),则必须使用Group Comparison Conditions。有两种选择:

-谓词对于子查询返回的 ALL 值有效

谓词对于子查询返回的 SOME (至少一个)值有效。

那么您可以做些什么

UPDATE TAB  
   SET COLUMN1 = 1 
 WHERE COLUMN2 = 'Y' 
   AND COLUMN3 = 'N' 
   AND TRUNC(COLUMN4)  < ALL
       (SELECT TRUNC(COLUMN4) 
          FROM TAB  
         WHERE COLUMN2 = 'Y' AND COLUMN3 = 'Y');

更新将以TRUNC(COLUMN4)小于 **由子查询返回的** ALL *值的行完成。

答案 1 :(得分:0)

我认为信息很清楚。也许您应该使用聚合函数:

UPDATE TABLE 
   SET COLUMN1 = 1 
WHERE COLUMN2 = 'Y' AND
      COLUMN3 = 'N' AND
      TRUNC(COLUMN4) < (SELECT MIN(TRUNC(COLUMN4))
                        FROM TABLE 
                        WHERE COLUMN3 = 'Y' AND COLUMN4 = 'Y'
                       );

编辑:

鉴于您指定的列,可以将其简化为:

UPDATE TABLE 
   SET COLUMN1 = 1 
WHERE COLUMN2 = 'Y' AND
      COLUMN3 = 'N' AND
      TRUNC(COLUMN4) < 'Y';

如果子查询的目的是查看是否存在任何行,则可能需要附加条件。