2017-11-29 3 views
0

다른 테이블과의 복잡한 관계에 따라 Table_H의 "설명"열을 업데이트하려고했습니다. 여기에 원래의 (다소 obfiscated) 쿼리입니다 :Join 테이블의 날짜 열 중 하나의 최대 날짜 값을 기준으로 업데이트 수행 (Oracle)

 UPDATE Table_H hb SET 
     description = 'New Description' 
     where exists 
     (select 1 
     from TABLE_J j, TABLE_I i, TABLE_K k, Table_H h, TABLE_M m 
     where j.Alt_id = i.Alt_id 
     and i.id=k.id 
     and k.id=h.id 
     and k.Alt_id = m.Alt_id 
     and j.Activity='Activity A' 
     and h.description = 'Old Description' 
     and h.id=hb.id 
     ); 

이 쿼리에 대한 문제는 너무 많은 Table_H 행을 갱신이었다 (쿼리에있는 다른 테이블의 행과 관련이있는 행과 같은). 이것은 Table_H가 항상 고유 한 Table_H.date 필드를 제외하고 동일한 여러 행을 가졌기 때문입니다. 필자가 실제로해야 할 일은 Table_H 행만 MAX Table_H.date 필드로 업데이트하는 것이 었습니다.

특히 내 상황에 가까운 오래된 스레드를 찾을 수 없었습니다. 분명히 Table_H.Date 열을 소개해야하지만 진행 방법을 알지 못합니다. 나는 어떤 응답에도 감사 할 것이다. 고마워요

+0

최대 날짜가있는 행만 업데이트 하시겠습니까? –

+0

네, 맞습니다. –

답변

0

이 같은 것이 필요할 것입니다.

UPDATE Table_H hb 
SET description = 'New Description' 
WHERE EXISTS 
    (SELECT 1 
    FROM TABLE_J j, 
    TABLE_I i, 
    TABLE_K k, 
    Table_H h, 
    TABLE_M m 
    WHERE j.Alt_id = i.Alt_id 
    AND i.id   =k.id 
    AND k.id   =h.id 
    AND k.Alt_id  = m.Alt_id 
    AND j.Activity ='Activity A' 
    AND h.description = 'Old Description' 
    AND h.id   =hb.id 
) 
AND hb.date_t IN 
    (SELECT MAX(Date_t) FROM Table_H 
); 

여기 Date_t 내가 답변을 주셔서 감사합니다 당신의 date

+0

고마워요. 나는 끝에 "AND hb.date ..."를 추가하려고 시도했다. 실행 중이지만 어떤 이유로 열을 업데이트하지 않습니다. –

+0

두 조건을 모두 만족하는 레코드가 없습니다. –

0

입니다. 날짜 열을 직접 사용하지 않고이 작업을 수행 할 수있는 방법을 발견했습니다. 나는 max (table_h.id) 컬럼을 대신 사용했다. (최대 id는 max (table_h.date)에 직접적으로 대응하고 이것은 이전에 쿼리를 작성했다). 여기에 해결책이 있습니다. stackoverflow에서 다른 사용자에게 매우 좋은 학습 기회가 아니라면 사과드립니다.

UPDATE Table_H hb 
SET description = 'New Description' 
WHERE EXISTS 
    (SELECT 1 from 
(select max(h.id) hid, k.Alt_id 
FROM TABLE_J j, 
TABLE_I i, 
TABLE_K k, 
Table_H h, 
TABLE_M m 
WHERE j.Alt_id = i.Alt_id 
AND i.id   =k.id 
AND k.id   =h.id 
AND k.Alt_id  = m.Alt_id 
AND j.Activity ='Activity A' 
AND h.description = 'Old Description' 
GROUP BY k.alt_id) abc 
WHERE abc.hid = hb.id 
) 
관련 문제