2016-08-19 2 views
-1

SQLPLUS에서 aisle from table itemloc_tmpaisle from table itemloc_tbl에서이 SQL 문으로 업데이트하고 항목에서와 같이 오류를 계속 반환합니다.SQL 오류를 업데이트하는 중 ORA-01427 : 단일 행 하위 쿼리가 둘 이상의 행을 반환합니다.

업데이트 : itemloc_tmp

ITEM_ID  SID SEC AIS 
------------- --- --- --- 
0007AAAAAAAAA  AA3 12 
0007BBBBBBBBB  BB2 13 
0007CCCCCCCCC  CC8 11 

이가에서 이것은 샘플 데이터 이것은 내 SQL 문

UPDATE ct.itemloc_tbl t1 SET 
    t1.aisle = (SELECT t2.aisle FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id) 
    WHERE t1.item_id IN (SELECT t2.item_id FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id) 

그래서입니다 itemloc_tbl

ITEM_ID  SID SEC AIS 
------------- --- --- --- 
0007AAAAAAAAA 
0007BBBBBBBBB  
0007CCCCCCCCC  

의 샘플, 내가 원하는 aisle 열을 업데이트하십시오. n은 itemloc_tmp에서 itemloc_tbl이지만 위의 내용은 작동하지 않습니다. 아무도 내가 잘못한 곳을 지적 해 주겠니?

+1

하위 쿼리가 여러 결과를 반환합니다 (오류가 말한 것처럼) - 'aisle' 열을 업데이트 할 때 사용해야하는 값은 무엇입니까? 샘플 데이터와 예상 결과가 도움이 될 것입니다. – sgeddes

+0

다음과 같이 오류가 발생합니다 :'SELECT t2.aisle FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id'는 둘 이상의 행을 반환합니다. 'item_id' 값은 고유하지 않습니까? 그게 정상인가요? – sstan

+0

예, item_id와 aisle은 고유하지 않습니다. 그리고, 나는 '통로'를 갱신 할 방법을 찾고있다. 이후, sqlplus는 join 함수를 가지고 있지 않은 것으로 보입니다. – Alexander

답변

2

업데이트 할 행을 제한 할 수 있습니다. 두 가지 방법이 있습니다. 첫번째 rownum = 1 사용

UPDATE ct.itemloc_tbl t1 SET 
    SET t1.aisle = (SELECT t2.aisle FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id AND rownum = 1) 
    WHERE EXISTS (SELECT 1 FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id); 

두번째 집계 기능을 사용

UPDATE ct.itemloc_tbl t1 SET 
    SET t1.aisle = (SELECT MAX(t2.aisle) FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id) 
    WHERE EXISTS (SELECT 1 FROM ct.itemloc_tmp t2 WHERE t2.item_id = t1.item_id); 

이들 중 하나가 하나 개 이상의 행을 반환 부질 수있는 오류의 근위 원인을 해결. 그러나 과제를 위해 실제로 원하는 것을 결정해야합니다. "임의의"값이 좋으면이 값들이 작동합니다.

+0

감사합니다. 데이터베이스에서 샘플 데이터를 업데이트했습니다. – Alexander

관련 문제