UpdateError: Ошибка получения ORA - 01427 Подзапрос, состоящий из одной строки, возвращает более одной строки - PullRequest
3 голосов
/ 02 апреля 2012

Я пытаюсь обновить столбец на основе другого столбца в той же таблице (таблица ученика) и столбца из другой таблицы (школьная таблица)

Код:

update student_table
set student_code =
(select l.student_code
from school_table l, student_table n
where l.school = n.schoolname)

Я получаю следующую ошибку

ORA - 01427 Подзапрос из одной строки возвращает более одной строки

Любая помощь будет оценена.

Ответы [ 6 ]

4 голосов
/ 02 апреля 2012

Если вы запустите свой подзапрос, вы обнаружите, что он возвращает более одной строки.Вы пытаетесь обновить столбец, чтобы он соответствовал результату вашего подзапроса, чтобы он ожидал только одно значение.Вы должны ограничить свой подзапрос, чтобы он возвращал только одну строку, например, используя max () или min () или, возможно, вы намеревались присоединиться к внешней student_table?Попробуйте:

update student_table n
set student_code =
(select l.student_code
from school_table l
where l.school = n.schoolname);
3 голосов
/ 27 июня 2013

Мы все точно знаем, что говорит ошибка.SET ожидает только одно значение для каждого столбца.Чего мы хотим добиться, так это обновить все строки для данного столбца, используя значения из столбца другой таблицы.

Теперь вот решение:

BEGIN
For i in (select col_X, col_Y from table1) 
LOOP
Update table2 set col1 = i.col_X where col2 = i.col_Y;
END LOOP;
END;

Именно так вы запускаете его на рабочем листе SQLDeveloper.Говорят, что это медленно, но это единственное решение, которое помогло мне в этом деле.

3 голосов
/ 03 апреля 2012

Было бы полезно получить простое английское объяснение того, чего вы пытаетесь достичь.Сказав это, мне кажется, что вы можете выполнить то, что вы хотите сделать, с помощью следующего SQL [при условии отношения один-ко-многим между school_table и student_table], имеющего внутренний выбор в качестве основного подзапроса с внешним оператором обновления:

update student_table 
set student_code = (select l.student_code 
                    from school_table 
                    where school_table.school = student_table.schoolname) 
;

Надеюсь, это поможет.

С уважением, Роджер

0 голосов
/ 16 декабря 2014

Попробуйте добавить и rownum = 1 к условиям вашего подзапроса, если вам НЕ НУЖНО значение из списка или вы уверены, что они совпадают.

0 голосов
/ 02 апреля 2012

ограничивает вывод внутреннего запроса одним значением для успешного выполнения запроса.

select l.student_code
from school_table l, student_table n
where l.school = n.schoolname 

отметьте это

0 голосов
/ 02 апреля 2012

Ваш внутренний запрос ..

select l.student_code
from school_table l, student_table n
where l.school = n.schoolname 

может возвращать более одного значения. Запустите внутренний запрос и проверьте номер значения.

...