2015-01-23 2 views
0

다음 쿼리는 As400에서 실행중인 DB2에서 작동하지 않습니다. issues과 비슷한 내용을 읽었지만 적절하게 내 쿼리를 수정하는 방법을 잘 모릅니다.AS400, 6.1에서 실행중인 DB2에서 SQL 병합

merge into AB27PR AB 
    using (select USER, ROCOMP,REFID, QREADSTAT 
      from S490JR 
      where QREADSTAT =1) SR 
    on 
     (AB.USER= SR.USER 
     AND AB.XCCOMP = SR.ROCOMP 
     AND AB.XEFID = SR.REFID) 
    when matched 
    and AB.XREADSTAT = 0 
    then update set XREADSTAT = SR.QREADSTAT; 
+0

"작동하지 않음" – Siyual

+0

@Siyual 오류 메시지 : [SQL0104] 토큰 MERGE가 유효하지 않습니다. –

+0

AS/400 버전의 매뉴얼에서'MERGE '가 지원되는지 확인하십시오. – mustaccio

답변

1

이제는 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 절을 조건 지정해야합니다 성명 자체. "일치하는"행만 업데이트해야합니다.

0

실제로 시스템은 MERGE를 지원하지 않는 OS 6.1을 실행하고 있습니다.