在同一表上通过应用条件(除符号以外)来更新一组数据时出现错误。有人可以帮我吗。
下面是我的Oracle查询-
List
以下错误-
SQL错误:
ORA-01427 :单行子查询返回多个行 01427. 00000-“单行子查询返回多个行” *原因:
*动作:
答案 0 :(得分:3)
首先进行一些家庭作业;请不要调用您的表TABLE
(Oracle会抱怨)。另外,您的子查询没有任何意义:
(SELECT TRUNC(COLUMN4)
FROM TABLE
WHERE COLUMN3 = 'Y' AND COLUMN4 = 'Y')
如果COLUMN4 = 'Y
是TRUNC(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。有两种选择:
那么您可以做些什么
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';
如果子查询的目的是查看是否存在任何行,则可能需要附加条件。