ОРАКУЛ ОБНОВЛЕНИЕ ЖЕ ТАБЛИЦА - PullRequest
0 голосов
/ 16 сентября 2018

Я получаю ошибку при обновлении одного набора данных, применяя условие (МЕНЬШЕ, ЧЕМ СИМВОЛ) с другим набором данных в той же таблице.Может кто-нибудь, пожалуйста, помогите мне.

Ниже мой оракула запрос -

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

ОШИБКА КАК НИЖЕ -

Ошибка SQL:

ORA-01427 : однострочный подзапрос возвращает более одной строки 01427. 00000 - «однострочный подзапрос возвращает более одной строки» * Причина:
* Действие:

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Первые немного домашнее задание ; пожалуйста, не называйте свой стол 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 * значений, возвращаемых подзапросом.

0 голосов
/ 16 сентября 2018

Я думаю, что сообщение довольно ясно.Возможно, вам следует использовать функцию агрегирования:

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';

Вы можетенужно дополнительное условие, если целью подзапроса было проверить, существуют ли какие-либо строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...