2011-07-15 125 views
-2

我有这个疑问会抛出错误-SQL提供了错误SQL查询来更新列

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

在甲骨文8

UPDATE STG1_HFHS_ENR_EMP_ROSTER_2005 A 
SET 
A.BUSINESS_UNIT = 
(SELECT t.BUSINESS_UNIT 
FROM STG1_HFHS_ENR_EMP_ROS_2005_TMP t, STG1_HFHS_ENR_EMP_ROSTER_2005 s 
WHERE t.ID = s.ID) 

请帮我解决上述错误。我要更新一列"A.BUSINESS_UNIT =

+1

格式是你的朋友! –

+1

您的子选择返回多行。你需要在'WHERE'或者'LIMIT'中用一个额外的子句来限制它。你想在次选中得到什么? – Jacob

+0

我必须从内部查询中选择.BUSINESS_UNIT并更新外部查询 – rohit

回答

2

试试这个:

UPDATE STG1_HFHS_ENR_EMP_ROSTER_2005 A 
SET 
A.BUSINESS_UNIT = 
(SELECT t.BUSINESS_UNIT 
FROM STG1_HFHS_ENR_EMP_ROS_2005_TMP t 
WHERE t.ID = A.ID AND ROWNUM < 2) 
+0

Thanks.But现在我们在SELECT TOP 1 t.BUSINESS_UNIT子查询中得到另一个错误,它表示ORA000923:从关键词中找不到预期的地方。 **停止在TOP 1.我正在使用Oracle 8 – rohit

+0

@rohit不明白错误描述。 – VMAtm

+0

@VMAtm:那个“ORDER BY t.ID”的目的是什么? –

0
UPDATE stg1_hfhs_enr_emp_roster_2005 a 
SET 
a.business_unit = 
(SELECT business_unit 
FROM (SELECT business_unit 
     FROM stg1_hfhs_enr_emp_ros_2005_tmp 
     ORDER BY ... -- some clause that puts the most relevant business_unit as first 
    ) 
WHERE id = a.id 
    AND ROWNUM < 2); 

不幸的是我没有访问Oracle 8对此进行测试。 需要两层内嵌视图来订购和限制行数。另外,你不能直接在最深的内联视图(一些愚蠢的Oracle限制)内引用表“a”,所以它在中间视图中是需要的。

+0

rownum <2做什么? – rohit

+0

@rohit保证在多行的情况下只返回第一行,它可以防止“ORA-01427单行子跳ery返回多行“ – jva