Sql 如何解决ORA-01427错误(单行子查询返回多行)?

Sql 如何解决ORA-01427错误(单行子查询返回多行)?,sql,oracle,plsql,Sql,Oracle,Plsql,我的查询不断返回ORA-01427错误,我不知道如何解决它 update db1.CENSUS set (notes) = ( select notes from db2.CENSUS cen where db1.CENSUS.uid = cen.uid ) where headcount_ind = 'Y' and capture_FY = '2015' 又快又脏的是 update db1.C

我的查询不断返回ORA-01427错误,我不知道如何解决它

update db1.CENSUS set (notes)
    =
    (
            select notes
            from db2.CENSUS cen
            where  db1.CENSUS.uid = cen.uid

    )
where headcount_ind = 'Y' and capture_FY = '2015'
又快又脏的是

update db1.CENSUS  cen set cen.notes
    =
    (
            select MAX(notes)
            from db2.census census
            where  db1.DW_HRT_PERSONNEL_CENSUS.uid = census.uid

    )
where cen.headcount_ind = 'Y' and cen.capture_FY = '2015'
但是,这可能不符合您的要求。db1.DW_HRT_人员_人口普查的一名成员输入了多个注释

为了防止此错误,必须了解表之间的关系。这是db1.DW_HRT_人员普查的一名成员映射到一个注释,还是更有可能的是,db1.DW_HRT_人员普查的一名成员可以制作多个普查注释?更可能的解决方案是:

CURSOR census_taker IS
SELECT db1.DW_HRT_PERSONNEL_CENSUS.UID
FROM  db1.DW_HRT_PERSONNEL_CENSUS;

For each census_taker in db1.DW_HRT_PERSONNEL_CENSUS LOOP
update db1.CENSUS  cen set cen.notes
    =
    (       select census.notes
            from db2.census census
            where  db1.DW_HRT_PERSONNEL_CENSUS.uid = census.uid
    )
where cen.headcount_ind = 'Y' 
and cen.capture_FY = '2015'
and cen.PERSONNEL_CENSUS_UID = census_taker.UID;

端环

该错误表示子查询

select notes
  from db2.CENSUS census
 where db1.CENSUS.uid = census.uid
正在返回多个带有注释的行,而UPDATE语句希望返回单个值

尝试以下方法

update db1.CENSUS set (notes) = (select notes
                                   from db2.CENSUS census
                                        inner join db1.CENSUS db1Census on db1Census.uid = census.uid
                                  where db1Census.headcount_ind = 'Y'
                                    and db1Census.capture_FY = '2015')
 where headcount_ind = 'Y' and capture_FY = '2015'

如果
uid
db2.CENSUS
中存在重复条目,并且
headcount\u ind='Y'和capture\u FY='2015'
中至少存在
uid
值的
db2.CENSUS
中存在多行,则可能会出现相同的错误。(可能还有更多。)您可以通过执行以下操作来确定是哪些
uid
的值导致了问题:

SELECT uid, COUNT(*)
  FROM db2.census
 GROUP BY uid
HAVING COUNT(*) > 1;
UPDATE db1.census c1
   SET c1.notes = ( SELECT max(c2.notes)
                      FROM db2.census c2
                     WHERE c2.uid = c1.uid )
 WHERE c1.headcount_ind = 'Y'
   AND c1.capture_FY = '2015'
   AND EXISTS ( SELECT 1 FROM db2.census c2
                 WHERE c2.uid = c1.uid );
在这一点上,你可以做很多事情。您可以删除额外的行(可能没有那么多,您也不需要),并在原始查询中进行更新,或者您可以在用于更新的子查询中使用聚合,例如:

update db1.CENSUS set (notes)
=
(
        select MAX(notes)
        from db2.CENSUS cen
        where  db1.CENSUS.uid = cen.uid

)
where headcount_ind = 'Y' and capture_FY = '2015';
此外,按照上面的查询方式,如果
db2.CENSUS
中没有对应的
notes
值,则
db1.CENSUS.uid
的某些值将
db1.CENSUS.notes
设置为
NULL
。也许这就是你想要的行为?如果没有,您将需要以下内容:

SELECT uid, COUNT(*)
  FROM db2.census
 GROUP BY uid
HAVING COUNT(*) > 1;
UPDATE db1.census c1
   SET c1.notes = ( SELECT max(c2.notes)
                      FROM db2.census c2
                     WHERE c2.uid = c1.uid )
 WHERE c1.headcount_ind = 'Y'
   AND c1.capture_FY = '2015'
   AND EXISTS ( SELECT 1 FROM db2.census c2
                 WHERE c2.uid = c1.uid );

您还可以在子查询中使用分析功能,例如

排名()超过(按普查划分.uid按1描述排序)


然后选择第一列或第二列

您的更新查询期望内部查询解析为单个记录,但它实际上是一个数组。如果内部查询中的每个结果都具有相同的值,则可以执行以下操作:

update A a set a.x = (select b.x from B b where ... and ROWNUM=1)
例如


当你说“你有一个db1.DW_HRT_人员_人口普查的一个成员输入的多个便条”时,你是什么意思?我想我不完全理解为什么会收到这个错误消息。这是一个名为“notes”的字段,我想用另一个模式(db2)中相同表中的条目更新所有条目。括号中的结果必须返回一行。出现此错误是因为它返回了多行。