MERGE INTO 문법이 잘못 된건가요??? 0 6 2,607

by 시리님이시네 [2012.08.29 09:24:56]


안녕하세요 아래 쿼리 문법 오류 좀 잡아 주세요...

MERGE INTO if_rem_result_h A USING ppsd_drum_prod B ON ( a.matnr = b.prod_no AND budat ='20120828' AND bf_type ='BF' AND b.prod_no = 'CFM0001-E16F')
WHEN MATCHED THEN    
    UPDATE   
   SET menge ='100'
   WHEN NOT MATCHED THEN
    INSERT   
   ( matnr,    
werks,  
budat,  
mesid,  
verid,  
mdv01,  
alort,  
menge,  
erfme,  
c_type,
bf_type,    
CANCEL,
if_flag
   )
   VALUES(  
    'CFM0001-E16F' ,    
b.werks,    
TO_CHAR(SYSDATE,'yyyymmdd'),    
(SELECT 'P' || LPAD(NVL(MAX(REPLACE(mesid,'P')),0)+1,9,0)  FROM IF_REM_RESULT_H WHERE mesid LIKE 'P%') ,   
b.verid,    
b.mdv01,    
b.alort,    
'100',    
b.base_unit,    
'Y',    
'BF',   
'N',    
'P'
    )  


b.컬럼들을 못찾는것 같습니다...

아래 문법 처럼 insert 할수 없나요??
  INSERT INTO
  <(column_list)>
SELECT
FROM
WHERE ;

by Oracler [2012.08.29 09:55:31]
정확하게는 INSERT 문을 문법에 맞지 않게 사용하셨습니다.

마지막 질문처럼 INSERT는 당연히 할 수 있습니다만 질문자께서 사용하신 MERGE문에서의 INSERT문은 마지막에 제시하신 문법처럼 사용하신 것이 아닙니다. 질문자께서 사용하신 문법은 INSERT INTO (...) VALUES (값, ..., 서브쿼리, ...) 이런 형식이지요.

INSERT 문의 VALUES 절에는 값이나 값이 될 수 있는 expression이 올 수 있지만 서브쿼리는 올 수 없습니다.
그리고 가능하다고 하더라도 VALUES 절에 사용된 서브쿼리의 결과가 2개 이상 나올 수 있기 때문에 불가합니다.

이런 경우는 저도 첨 보는 거라 잘 될지는 확신할 수 없습니다만, 일단 아래의 MERGE문을 실행해 보세요.
MERGE INTO if_rem_result_h A 
USING ppsd_drum_prod B 
ON ( a.matnr = b.prod_no AND budat ='20120828' AND bf_type ='BF' AND b.prod_no = 'CFM0001-E16F')
WHEN MATCHED THEN  
  UPDATE  
  SET menge ='100' 
WHEN NOT MATCHED THEN
  INSERT (matnr
     , werks
     , budat
     , mesid
     , verid
     , mdv01
     , alort
     , menge
     , erfme
     , c_type
     , bf_type
     , CANCEL
     , if_flag
  )
  SELECT 'CFM0001-E16F'
     , b.werks
     , TO_CHAR(SYSDATE,'yyyymmdd')
     , 'P' || LPAD(NVL(MAX(REPLACE(mesid,'P')),0)+1,9,0)
     , b.verid
     , b.mdv01
     , b.alort
     , '100'
     , b.base_unit
     , 'Y'
     , 'BF'
     , 'N'
     , 'P'
  FROM IF_REM_RESULT_H WHERE mesid LIKE 'P%'
;  

by RASHID [2012.08.29 10:39:35]
// Oracler

Oracler님 쿼리에서 셀렉트 부분에 MAX함수때문에 에러날텐데요...

그리고 insert 구문에서 서브쿼리 가능하구요....


// 시리님이시네  

제가 보기엔 딱히 문제가 없어보이는데... 서브쿼리도 그룹함수라 하나만 나올테고..

무슨 오류 나는지 좀 알려주세요... 에러코드라도...

by Oracler [2012.08.29 10:47:58]
@RASHID

아, MAX 함수가 있어서 저렇게는 안되겠군요. ㅠ.ㅠ

하지만 INSERT 구문에서 서브쿼리가 불가능하다는 말이 아니고 INSERT의 VALUES 절에 서브쿼리가 불가하다고 분명히 적었습니다.
자세히 보시면 시리님이시네님의 INSERT의 서브쿼리는 VALUES 절의 값에 사용된 것입니다.

by Oracler [2012.08.29 10:51:40]
 RASHID님의 말씀을 참고하여 다시 작성하였습니다. ^^
MERGE INTO if_rem_result_h A 
USING ppsd_drum_prod B 
ON ( a.matnr = b.prod_no AND budat ='20120828' AND bf_type ='BF' AND b.prod_no = 'CFM0001-E16F')
WHEN MATCHED THEN  
  UPDATE  
  SET menge ='100' 
WHEN NOT MATCHED THEN
  INSERT (matnr
     , werks
     , budat
     , mesid
     , verid
     , mdv01
     , alort
     , menge
     , erfme
     , c_type
     , bf_type
     , CANCEL
     , if_flag
  )
  SELECT 'CFM0001-E16F'
     , b.werks
     , TO_CHAR(SYSDATE,'yyyymmdd')
     , (SELECT'P' || LPAD(NVL(MAX(REPLACE(mesid,'P')),0)+1,9,0)
      FROM IF_REM_RESULT_H WHERE mesid LIKE 'P%')
     , b.verid
     , b.mdv01
     , b.alort
     , '100'
     , b.base_unit
     , 'Y'
     , 'BF'
     , 'N'
     , 'P'
  FROM DUAL
; 

by RASHID [2012.08.29 10:59:36]
// Oracler

내용이 자꾸 산으로 가네요..ㅎㅎ 

values 절에서도 서브쿼리 사용 가능 합니다...

물론 merge 문 안에 있는 inert 구문 내 values 절에서도 서브쿼리 가능하구요..

by Oracler [2012.08.29 11:24:18]
@RASHID

아, 그렇군요. 제가 잘 못 알고 있었나봅니다.^^

잘못된 답변을 드려 시리님이시네님께 죄송하네요. ㅠ.ㅠ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입