2015-04-02 1349 views
0

我的查詢不斷返回一個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' 
+1

括號中的結果必須返回一行。您遇到此錯誤是因爲它返回了多行。 – codingbiz 2015-04-02 18:57:18

回答

2

因爲在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'; 

此外,查詢它的正上方,如果沒有的notesdb2.CENSUSdb1.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); 
0

快速和骯髒的是

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;

+0

當你說「你有多個由db1.DW_HRT_PERSONNEL_CENSUS成員輸入的註釋時,你是什麼意思」。 我想我不完全理解爲什麼我得到這個錯誤信息。這是一個名爲「notes」的字段,我想用另一個模式(db2)中同一個表中的條目更新所有條目, – KinsDotNet 2015-04-02 18:54:50

0

的錯誤意味着子查詢

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'

0

您還可以使用分析功能在你的子查詢,如

RANK()OVER(PARTITION BY census.uid ORDER BY 1 DESC)

,然後選擇第一個等級或

0

您更新查詢預計內部查詢解析到一個記錄第二級,但它實際上是一個數組。如果內部查詢中的每個結果具有相同的值,則可以這樣做:

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' 
相關問題