0

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

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 错误的其他帖子

4

2 回答 2

2

正如你在这里看到的

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。

于 2012-09-10T19:32:44.503 回答
1

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

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

更新:

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

我也想到你可能误解了什么DISTINCT。这确保了返回结果是唯一的——但仍然可能有多个唯一的结果。

于 2012-09-10T19:28:47.380 回答