我的查詢不斷返回一個ORA-01427錯誤,我不知道如何解決它。如何解決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'
我的查詢不斷返回一個ORA-01427錯誤,我不知道如何解決它。如何解決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'
因爲在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';
此外,查詢它的正上方,如果沒有的notes
在db2.CENSUS
爲db1.CENSUS.uid
一些值相應價值的方式,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);
快速和骯髒的是
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;
END LOOP;
當你說「你有多個由db1.DW_HRT_PERSONNEL_CENSUS成員輸入的註釋時,你是什麼意思」。 我想我不完全理解爲什麼我得到這個錯誤信息。這是一個名爲「notes」的字段,我想用另一個模式(db2)中同一個表中的條目更新所有條目, – KinsDotNet 2015-04-02 18:54:50
的錯誤意味着子查詢
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
重複條目的uid
並在headcount_ind = 'Y' and capture_FY = '2015'
您還可以使用分析功能在你的子查詢,如
RANK()OVER(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'
括號中的結果必須返回一行。您遇到此錯誤是因爲它返回了多行。 – codingbiz 2015-04-02 18:57:18