如何修复 Ora-01427 单行子查询 returns 超过一行的 Update 语句?

How to fix Ora-01427 single-row subquery returns more than one row in Update statement?

这是我的查询:

UPDATE CIELA_STATUS 
SET CIELA_STATUS.OSIGURENI = (
  SELECT STG5.OSIGURENI
  FROM CIELA_STATUS_STG5 STG5
  WHERE CIELA_STATUS.UIC = STG5.UIC)
WHERE EXISTS (
  SELECT STG5.OSIGURENI
  FROM CIELA_STATUS_STG5 STG5
  WHERE CIELA_STATUS.UIC = STG5.UIC
  AND nvL(CIELA_STATUS.OSIGURENI, 9999) <> STG5.OSIGURENI)

正如错误所说,子查询用于 set 更新的列产生了不止一行。

最可能的解释是 UIC 不是 table CIELA_STATUS_STG5[ 中的 primary/unique 键=17=]

快速检查

select UIC, count(*)
from CIELA_STATUS_STG5
group by UIC
having count(*) > 1

您会看到重复的密钥,您必须决定如何恢复。例如。删除重复项,或仅在更新中使用 MAX 值或使用 newes/oldest 行等

注意 - 为了更集中地选择重复项,因为您不在更新中使用整个 table CIELA_STATUS_STG5 使用此查询,这会产生相同的 限制 更新中使用:

SELECT 
  STG5.UIC, count(*) cnt
FROM CIELA_STATUS_STG5 STG5
WHERE  STG5.UIC IN (
SELECT  CIELA_STATUS.UIC
FROM CIELA_STATUS 
WHERE EXISTS
      (SELECT STG5.OSIGURENI
                         FROM CIELA_STATUS_STG5 STG5
                         WHERE  CIELA_STATUS.UIC = STG5.UIC
                         AND nvL(CIELA_STATUS.OSIGURENI,9999) <> STG5.OSIGURENI)
)
GROUP BY STG5.UIC
HAVING count(*) > 1;

问题出在您查询的这一部分:

SELECT STG5.OSIGURENI
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC

正在返回多行。您需要一种方法来从众多行中恰好选择一行进行插入。

如果给出可接受的结果,最简单的方法是使用 MIN()MAX():

SELECT MAX(STG5.OSIGURENI)
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC

所以您的整个查询将是:

UPDATE CIELA_STATUS 
SET CIELA_STATUS.OSIGURENI = (
  SELECT MAX(STG5.OSIGURENI)
  FROM CIELA_STATUS_STG5 STG5
  WHERE CIELA_STATUS.UIC = STG5.UIC)
WHERE EXISTS (
  SELECT STG5.OSIGURENI
  FROM CIELA_STATUS_STG5 STG5
  WHERE CIELA_STATUS.UIC = STG5.UIC
  AND nvL(CIELA_STATUS.OSIGURENI, 9999) <> STG5.OSIGURENI)

如果 MAX() 没有给出正确的结果,您将不得不设计一个查询,从许多匹配的行中选择合适的行。