4

我正在尝试根据同一张表(学生表)中的另一列和另一张表(学校表)中的一列更新一列

代码是:

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

我收到以下错误

ORA - 01427 单行子查询返回多于一行

任何帮助,将不胜感激。

4

6 回答 6

5

如果你运行你的子查询,你会发现它返回不止一行。您正在尝试将列更新为等于子查询的结果,因此它只需要一个值。您应该将子查询限制为仅返回一行,例如使用 max() 或 min() 或者,也许您打算加入外部 student_table?尝试:

update student_table n
set student_code =
(select l.student_code
from school_table l
where l.school = n.schoolname);
于 2012-04-02T03:24:20.477 回答
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) 
;

希望这可以帮助。

问候,罗杰

于 2012-04-03T14:15:55.677 回答
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 工作表上运行它的确切方式。他们说这很慢,但这是在这种情况下对我有用的唯一解决方案。

于 2013-06-27T02:54:12.107 回答
0

你内心的疑问..

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

可能返回多个值。运行内部查询并检查值的数量。

于 2012-04-02T03:29:47.077 回答
0

将内部查询的输出限制为一个值以成功运行您的查询。

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

检查这个

于 2012-04-02T06:36:10.063 回答
-1

如果您不关心列表中的值或确保它们相同,请尝试将 and rownum=1 添加到您的子查询条件中。

于 2014-12-16T08:49:42.913 回答