Первые немного домашнее задание ; пожалуйста, не называйте свой стол 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: однострочный подзапрос возвращает более одной строки
Проблема в том, что с <
вы можете сравнить только два числа, если хотите сравнить число с набором чисел (= результат подзапроса с большим количеством строк), вы должны использовать Условия сравнения групп . Доступны два варианта:
- предикат действителен для 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 * значений, возвращаемых подзапросом.