我正在尝试根据同一个表(学生表)和列中的另一列更新列 从另一张桌子(学校表)
代码是:
update student_table
set student_code =
(select l.student_code
from school_table l, student_table n
where l.school = n.schoolname)
我收到以下错误
ORA - 01427单行子查询返回多行
任何帮助都将不胜感激。
答案 0 :(得分:4)
如果运行子查询,则会发现它返回多行。您正在尝试将列更新为等于子查询的结果,因此它只需要一个值。您应该将子查询限制为仅返回一行,例如使用max()或min(),或者您可能想要加入外部student_table?尝试:
update student_table n
set student_code =
(select l.student_code
from school_table l
where l.school = n.schoolname);
答案 1 :(得分:3)
对您要完成的内容进行简单的英语解释会很有帮助。话虽如此,在我看来,你可以用以下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)
;
希望这有帮助。
此致 罗杰
答案 2 :(得分:3)
我们都知道错误的确切含义。 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 :(得分:0)
你的内心疑问..
select l.student_code
from school_table l, student_table n
where l.school = n.schoolname
可能会返回多个值。运行内部查询并检查值的编号。
答案 4 :(得分:0)
将内部查询的输出限制为一个值,以成功运行查询。
select l.student_code
from school_table l, student_table n
where l.school = n.schoolname
答案 5 :(得分:-1)
如果您不关心列表中的值或确定它们是相同的,请尝试将rownum = 1添加到子查询条件中。