MERGE문 오류 질문입니다. 0 2 9,471

by pajama [SQL Query] merge using subquery [2020.07.28 22:26:44]


안녕하세요. 오라클 11g에서 아래 쿼리를 실행하면 오류가 발생합니다.

INSERT 문장의 서브쿼리부분이 문제인듯 한데..

MERGE문의 서브쿼리에서는 USING절의 인라인뷰를 참조할 수 없는건지요?

이런 경우에는 USING절에서 조인을 하는것이 나을까요?

ERROR at line 82:
ORA-00904: "X"."JURIS_TPO_CD": invalid identifier

 

MERGE INTO Z_CONF_DEVICE D USING (
           SELECT
                     EQUIP_MGMT_NUM
                     , TID
                     , EQUIP_TYP_CD
                     , EQUIP_TYP_NM
                     , IP_ADDR
                     , TPO_CD
                     , TPO_NM
                     , JURIS_TPO_CD
                     , JURIS_TPO_NM
                     , EMS_IP_ADDR
                     , INST_ADDR
                     , ESTB_DD
                     , WRK_DT
                     , EQUIP_GRP
                     , SVC_TYP_NM
                     , ONU_MAC_NO
                     , USG_GUBUN
                     , SUP_EQUIP_MGMT_NUM
                     , LDONG_CD
                     , CT_PVC_NM
                     , CT_GUN_GU_NM
                     , UP_MYUN_DONG_NM
                     , LOCATION2
                     , KEY_POSITION
                     , EQUIP_GRP_NUM
                     , MANG_TYP_CD
           FROM   Z_SWING_ADSL_DEVICE_S1
) X ON (D.DEVICENUM=X.EQUIP_MGMT_NUM)
WHEN NOT MATCHED THEN INSERT (
                     devicenum
                     , tid
                     , devtype
                     , deviceip
                     , tpo_cd
                     , tpo_nm
                     , k_tpo_cd
                     , k_tpo_nm
                     , emsip
                     , wrk_dt
                     , gendatetime
                     , devgroup
                     , service_name
                     , dev_mac
                     , dev_mass_kind
                     , up_devicenum
                     , ldong_cd
                     , lsido_nm
                     , lgugun_nm
                     , ldong_nm
                     , location
                     , teamcode
                     , funcgroup
                     , ingroup
                     , del_flag
                     , decisiontime
                     , updatetime
                     , mang_type_cd
           ) VALUES (
                     X.EQUIP_MGMT_NUM
                     , X.TID
                     , X.EQUIP_TYP_CD
                     , X.IP_ADDR
                     , X.TPO_CD
                     , X.TPO_NM
                     , X.JURIS_TPO_CD
                     , X.JURIS_TPO_NM
                     , X.EMS_IP_ADDR
                     , X.ESTB_DD
                     , X.WRK_DT
                     , X.EQUIP_GRP
                     , X.SVC_TYP_NM
                     , X.ONU_MAC_NO
                     , X.USG_GUBUN
                     , X.SUP_EQUIP_MGMT_NUM
                     , X.LDONG_CD
                     , X.CT_PVC_NM
                     , X.CT_GUN_GU_NM
                     , X.UP_MYUN_DONG_NM
                     , NVL(X.INST_ADDR,'')||NVL2(X.Location2,'',' ['||X.Location2||']')
                     , (select teamcode from center_code_tbl where k_tpo_cd = X.JURIS_TPO_CD)
                     , 0 -- funcgroup
                     , 0 -- ingroup
                     , '0'
                     , TO_CHAR(sysdate,'YYYYMMDD') 
                     , TO_CHAR(sysdate,'YYYYMMDD')
                     , X.MANG_TYP_CD
           )
WHEN MATCHED THEN UPDATE SET
           tid = X.TID
           , devtype = X.EQUIP_TYP_CD
           , deviceip = X.IP_ADDR
           , tpo_cd = X.TPO_CD
           , tpo_nm = X.TPO_NM
           , k_tpo_cd = X.JURIS_TPO_CD
           , k_tpo_nm = X.JURIS_TPO_NM
           , emsip = X.EMS_IP_ADDR
           , wrk_dt = X.ESTB_DD
           , gendatetime = X.WRK_DT
           , devgroup = X.EQUIP_GRP
           , service_name = X.SVC_TYP_NM
           , dev_mac = X.ONU_MAC_NO
           , dev_mass_kind = X.USG_GUBUN
           , up_devicenum = X.SUP_EQUIP_MGMT_NUM
           , ldong_cd = X.LDONG_CD
           , lsido_nm = X.LDONG_CD
           , lgugun_nm = X.CT_PVC_NM
           , ldong_nm = X.UP_MYUN_DONG_NM
        , location = NVL(X.INST_ADDR,'')||NVL2(X.Location2,'',' ['||X.Location2||']')
           , teamcode = (select teamcode from center_code_tbl where k_tpo_cd = X.JURIS_TPO_CD)
        , funcgroup = 0
        , ingroup = 0
           , decisiontime = TO_CHAR(sysdate,'YYYYMMDD')
           , updatetime = TO_CHAR(sysdate,'YYYYMMDD')
           , mang_type_cd = X.MANG_TYP_CD
;

 

by 마농 [2020.07.28 23:21:35]

서브쿼리 부분이 문제인 것 같습니다.
서브쿼리 부분을 USING 절 안에서 사용하셔야 할 것 같습니다.
추가로 NVL 이나 NVL2 부분은 뭔가 잘못 사용하고 있는 듯한 느낌이 드네요.


by pajama [2020.07.28 23:53:50]

늦은시간인데 답변주셔서 감사드립니다.

원래 쿼리가 인포믹스에서 실행한 것인데 서브쿼리로 인해 merge문 오류가 발생하고 있어 오라클에서도 한번 테스트로 실행해보다가 질문을 올리게 되었습니다.

인포믹스용이라 null값 처리 차이로 nvl과 nvl2 용법도 이상하게 보이실듯 합니다. 세세한 부분까지 신경써주셔서 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입