2017-10-15 4 views
0

나는 초보자라는 말로 시작하겠습니다. 두 테이블 (위치 및 자산)이 있습니다. 위치 테이블에는 fac_id/bldg/location_code/loc_id가 있고 자산 테이블에는 fac_id/bldg/location_code/loc_id가 있습니다. 자산 테이블에서 loc_id가 null 인 위치 테이블에서 loc_id로 자산 테이블 loc_id를 업데이트해야합니다. 그러나 올바른 loc_id를 업데이트하려면 fac_id/bldg/location_code를 두 테이블에서 일치시켜야합니다. 오류가 계속 발생하는 스크립트가 있습니다. 나는 인터넷 연구 (조인, 내부 조인, 병합, 존재하는 곳 등)에서 여러 가지 비틀기를 시도했지만 아무 것도 작동하지 않습니다. 이 원본 스크립트에서 너무 많은 행 오류가 발생하거나 단일 행 하위 쿼리가 둘 이상의 행을 반환합니다. 바라건대 해결책은 내가 모르는 단순한 무언가이다.고유 키가없는 다중 열을 사용하는 Oracle 업데이트

어떤 도움을 주셔서 감사 드리며, 머리가 벽에 부딪히지 않도록 머리가 아파요.


UPDATE asset b 
SET b.loc_id = (SELECT DISTINCT l.fac_id, l.bldg, l.location_code, l.loc_id 
       FROM location l 
       WHERE upper(trim(b.fac_id))=upper(trim(l.fac_id)) 
        AND upper(trim(b.bldg))=upper(trim(l.bldg)) 
        AND upper(trim(b.location_code))=upper(trim(l.location_code)) 
       ) 
WHERE b.loc_id IS NULL; 

감사합니다!

답변

0

가장 간단한 해결책은 and rownum = 1입니다 :

UPDATE asset b 
    SET b.loc_id = (SELECT l.loc_id 
        FROM location l 
        WHERE upper(trim(b.fac_id)) = upper(trim(l.fac_id)) AND 
          upper(trim(b.bldg)) = upper(trim(l.bldg)) AND 
          upper(trim(b.location_code)) = upper(trim(l.location_code)) AND 
          rownum = 1 
        ) 
    WHERE b.loc_id IS NULL; 

그러나, 이것은 "진짜"해결책이 될 수 없습니다. 왜 당신은 여러 개의 일치하는 행이 있는지 알아 내야합니다. 아마도 상관 관계 조건이나 논리에 문제가있을 수 있습니다.