2016-08-11 7 views
0

행이 표 2에 존재할 때 표 1을 업데이트하는 여러 답변이 있지만 왼쪽 조인을 사용하여 표 2를 선택하면 작동하지 않습니다. 행 (더 나은 성능을 위해). 업데이트에 대한 해결책이 있지만 NOT IN을 사용할 때 성능이 크게 떨어집니다.오라클, 관련 행이 표 2에없는 경우 표 1의 업데이트 열

따라서이 SQL은 필요에 따라 테이블을 업데이트하지만 큰 테이블에 대해 실행하면 사용하기가 어렵습니다.

update header 
set status='Z' 
where status='A' 
and header.id not in (
    select headerid 
    from detail 
    where detail.id between 0 and 9999999 
); 

지금 나는 LEFT 올바른 ID를 반환 가입 사용 실적 쿼리를 가지고,하지만 난 같은 결과를 제공하기 위해 업데이트 문에 삽입 할 수 없었다.

ORA-01427 : 단일 행 부질 내가 실패 다음

update header 
set status = 'Z' 
where header.id = (
    select header.id 
    from header 
    left join detail on detail.headerid = header.id 
    where detail.headerid is null and header.status='A' 
) 

: 나는에로 업데이트 문이를 사용하는 경우 SELECT 문은 그래서

select header.id 
from header 
left join detail on detail.headerid = header.id 
where detail.headerid is null 
and header.status='A' 

입니다 둘 이상의 행을 반환합니다.

나는 ader.id가 반환되고 모든 행을 업데이트하려고합니다.

그래서 성능이 좋은 SQL select를 사용하여 테이블 헤더의 행을 반환하고 반환 된 행을 업데이트하는 솔루션을 찾고 있는데, 이는 세부 테이블의 관련 행이 없습니다.

도움을 주시면 감사하겠습니다. 그렇지 않으면 잘못 수행되는 업데이트가 남을 것입니다. 여러 헤더 ID &을 기대하고 있기 때문에 당신이이

Update 
    header 
Set status = 'Z' 
Where 
    header.id IN (select 
         header.id 
        From 
         header 
        Left join 
         detail 
        On 
         detail.headerid = header.id 
        Where 
         detail.headerid is null 
        And 
         header.status='A') 

답변

0

서브 쿼리는 여러 ID를 반환 subquery의 테이블. 내가으로이 논리를 작성하는 더 편안 해요 : 성능이 문제가되는 경우

update header h 
    set status = 'Z' 
    where not exists (select 1 
         from detail d 
         where d.headerid = h.id 
        ) and 
      h.status = 'A'; 

, detail(headerid)header(status, id) 도움의 인덱스.

0

나는 외부에 조건을 붙이지 않을 겁니다 시도 IN

사용해야 예상대로

0

일반적으로, 나는 보았다 다음 장소, 내가 대답을 발견 ...

update header set status='Z' where not exists (select detail.headerid from detail where detail.headerid = header.id) and status = 'A' 

아 글쎄, 적어도 그 여기에 다른 사람이 그것을 발견하고자하는 경우.

0

오류로 인해 하위 쿼리가 두 개 이상의 행을 반환하고 업데이트 쿼리에 = 기호를 사용하고 있습니다. = 귀하의 쿼리가 두 개 이상의 레코드를 반환하는 경우 = 부호가 허용되지 않습니다 IN, NOT IN, EXISTS, 존재하지 않음 요구 사항에 따라