이제는 6.1로 알려 졌으므로 MERGE가 적합하지 않으며 직선적 인 UPDATE를 사용할 수 있음을 알고 있습니다. 간단한 될 수 있습니다 AB.XREADSTAT 이후
update AB27PR AB
set AB.XREADSTAT = 1
where AB.XREADSTAT = 0
and exists(select SR.QREADSTAT
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1)
항상 테이블 S490JR에서 (1) 값을받을 것이다, 그것은 상수로 제공 할 수 있습니다. 유일한 요구 사항은 S490JR에 올바르게 일치하는 행이 존재해야한다는 것입니다. 처럼 보일 수있다 여기에 필요하지 않은 조건을 포함 할
보다 일반적인 UPDATE :이 경우
update AB27PR AB
set AB.XREADSTAT = (select max(SR.QREADSTAT)
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1)
where AB.XREADSTAT = 0
and exists(select SR.QREADSTAT
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1)
, 그것은 SR.QREADSTAT에 어떤 값을 가져옵니다. 물론 WHERE 절은 값을 (1)로 제한하기 때문에 여전히 SET 절에 대한 유일한 결과입니다.
또한 MAX() 함수는 WHERE 조건을 만족하는 S490JR에 여러 행이있을 가능성을 처리하기 위해 사용됩니다. 테이블의 모든 행에 포함 된 것이 무엇인지 알지 못합니다. SET 절의 하위 선택 결과 집합에는 단일 행만 포함될 수 있습니다. SET 열에는 하나의 값만 들어갈 수 있습니다. MAX() 함수는 값이 여러 일치하는 행에있을지라도 단일 값을 보장합니다. MAX() 대신 MIN() 함수를 사용할 수도 있습니다. (SQL에 ANY() 함수를 사용하고 싶지만 6.1에 사용 된 SQL 표준은 그다지 비슷하지 않습니다.)
두 예제 모두에서 subselect는 UPDATE의 WHERE 절을 조건 지정해야합니다 성명 자체. "일치하는"행만 업데이트해야합니다.
"작동하지 않음" – Siyual
@Siyual 오류 메시지 : [SQL0104] 토큰 MERGE가 유효하지 않습니다. –
AS/400 버전의 매뉴얼에서'MERGE '가 지원되는지 확인하십시오. – mustaccio