SQL错误ORA 01427

时间:2012-09-10 19:27:33

标签: sql oracle

我试图通过使用此查询从数据存储中的另一个表中收集值来更新表中的一个列

UPDATE tablename PT
SET DID = (select distinct(did) from datastore.get_dept_alias
where upper(ltrim(rtrim(deptalias))) = upper(ltrim(rtrim(PT."Dept Descr")))
AND cid = PT.CID)

注意:表中的列名与输入的列名相同

我收到ORA 01427错误。有关这个问题的任何想法? 我想了解这个ORA错误的其他帖子

2 个答案:

答案 0 :(得分:2)

正如您所见here

  

SQL错误:ORA-01427:单行子查询返回多行

这意味着您的子查询

select distinct(did) from datastore.get_dept_alias
where upper(ltrim(rtrim(deptalias))) = upper(ltrim(rtrim(PT."Dept Descr")))
AND cid = PT.CID)

返回多行。

那么,您确定distinct (did)是唯一的吗?看起来不是。我不建议使用where rownum = 1,因为您不知道将使用哪个值进行更新;除非你使用ORDER BY。

答案 1 :(得分:1)

您收到此错误是因为您的select语句可以返回多个结果。您无法使用可能返回多个结果的查询更新单个单元格。

使用许多SQL语言避免这种情况的常用方法是使用前1或类似的东西来确保引擎只返回一个结果。请注意,即使您知道查询只返回一个结果,您也必须这样做。仅仅因为你知道它并不意味着引擎知道它。引擎还必须保护您免受未来可能性的影响,而不仅仅是因为它们正好在这一刻。

更新

我注意到您已将问题更新到Oracle。因此,在这种情况下,您可以使用where rownum = 1子句将子查询限制为单个结果。正如其他答案指出的那样,你必须使用进一步的逻辑来确保返回的前1名是正确的。如果你不知道哪一个是正确的,那么先解决它。

我也想到你可能会误解DISTINCT的作用。这可确保返回结果是唯一的 - 但仍可能存在多个独特结果。