我如何解决 ORA-01427 错误(单行子查询 returns 多于一行)?
How can i resolve an ORA-01427 error (Single-row subquery returns more than one row)?
我的查询一直返回 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_PERSONNEL_CENSUS.
的一名成员输入了多个注释
为了防止这个错误,您必须知道表之间的关系。这是 db1.DW_HRT_PERSONNEL_CENSUS 的一个成员映射到一个笔记,或者更可能的是,db1.DW_HRT_PERSONNEL_CENSUS 的一个成员可以做很多人口普查笔记?更可能的解决方案是:
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'
如果 db2.CENSUS
和 headcount_ind = 'Y' and capture_FY = '2015'
中存在重复的条目,这也可能会给您同样的错误
您收到错误消息是因为 db2.CENSUS
中存在不止一行,至少值为 uid
。 (可能还有更多。)您可以通过执行以下操作找出导致问题的 uid
值:
SELECT uid, COUNT(*)
FROM db2.census
GROUP BY uid
HAVING COUNT(*) > 1;
那时你可以做很多事情。您可以删除多余的行(也许没有那么多,而且您无论如何都不想要它们)并像在原始查询中一样进行更新,或者您可以在要更新的子查询中使用聚合,例如:
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';
另外,按照上面的方式查询,如果db1.CENSUS.uid
的某个值在db2.CENSUS
中没有相应的notes
值,db1.CENSUS.notes
将设置为 NULL
。也许这就是你想要的行为?如果没有,您将需要类似以下内容:
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 );
您还可以在子查询中使用分析函数,例如
RANK() 超过(PARTITION BY census.uid ORDER BY 1 DESC)
然后选择一等或二等
您的更新查询期望内部查询解析为单个记录,但它实际上是一个数组。如果内部查询中的每个结果都具有相同的值,则可以这样做:
update A a set a.x = (select b.x from B b where ... and ROWNUM=1)
例如
update db1.CENSUS set (notes)
=
(
select notes
from db2.CENSUS cen
where db1.CENSUS.uid = cen.uid
and ROWNUM=1
)
where headcount_ind = 'Y' and capture_FY = '2015'
我的查询一直返回 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_PERSONNEL_CENSUS.
的一名成员输入了多个注释为了防止这个错误,您必须知道表之间的关系。这是 db1.DW_HRT_PERSONNEL_CENSUS 的一个成员映射到一个笔记,或者更可能的是,db1.DW_HRT_PERSONNEL_CENSUS 的一个成员可以做很多人口普查笔记?更可能的解决方案是:
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'
如果 db2.CENSUS
和 headcount_ind = 'Y' and capture_FY = '2015'
您收到错误消息是因为 db2.CENSUS
中存在不止一行,至少值为 uid
。 (可能还有更多。)您可以通过执行以下操作找出导致问题的 uid
值:
SELECT uid, COUNT(*)
FROM db2.census
GROUP BY uid
HAVING COUNT(*) > 1;
那时你可以做很多事情。您可以删除多余的行(也许没有那么多,而且您无论如何都不想要它们)并像在原始查询中一样进行更新,或者您可以在要更新的子查询中使用聚合,例如:
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';
另外,按照上面的方式查询,如果db1.CENSUS.uid
的某个值在db2.CENSUS
中没有相应的notes
值,db1.CENSUS.notes
将设置为 NULL
。也许这就是你想要的行为?如果没有,您将需要类似以下内容:
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 );
您还可以在子查询中使用分析函数,例如
RANK() 超过(PARTITION BY census.uid ORDER BY 1 DESC)
然后选择一等或二等
您的更新查询期望内部查询解析为单个记录,但它实际上是一个数组。如果内部查询中的每个结果都具有相同的值,则可以这样做:
update A a set a.x = (select b.x from B b where ... and ROWNUM=1)
例如
update db1.CENSUS set (notes)
=
(
select notes
from db2.CENSUS cen
where db1.CENSUS.uid = cen.uid
and ROWNUM=1
)
where headcount_ind = 'Y' and capture_FY = '2015'