2개의 문장을 한 번에 수행하려고 IF 문으로 합쳤는데, 좀 더 수정 필요 0 8 4,029

by 포동푸우 [SQL Query] MariaDB IF ELSE 2개 문장 1개로 병합. [2022.07.04 10:14:56]


--  문장을 효율적으로 수정하려면, 어느 부분을 더 수정해야 할지 조건을 부탁드립니다. 
--  실행 환경은 MariaDB 입니다. 
 
--  안녕하세요.,,  아래의  2개  문장을  한번에  실행하려고,  IF  문을  사용해서  아래와  같이  변경해  보았습니다.  

--  SQL1
UPDATE  TB_APRV  
      SET  PROC_PRGM_ID  =  'TEST'
  WHERE  APRV_DOC_ID  =  'A20220704100201'
      AND  APRV_ORD  =  6  
      AND  SB_APRV_ORD  =  1
      AND  (  SELECT  COUNT(*)  CNT  
                      FROM  TB_APRV  
                    WHERE  APRV_DOC_ID  =  'A20220704100201'
                        AND  APRV_ORD  IN  (4,5)
                        AND  APRV_RJCT_YN  IS  NULL)  =  0
			
--  SQL2
UPDATE  TB_APRV  
      SET  PROC_PRGM_ID  =  'TEST'
  WHERE  APRV_DOC_ID  =  'A20220704100201'
      AND  APRV_ORD  =  5
      AND  SB_APRV_ORD  =  (1+1)
      AND  (  SELECT  COUNT(*)  CNT  
                      FROM  TB_APRV  
                    WHERE  APRV_DOC_ID  =  'A20220704100201'
                        AND  APRV_ORD  IN  (4,5)
                        AND  APRV_RJCT_YN  IS  NULL)  >  0

--  SQL1+2
IF  (SELECT  count(*)  CNT
            FROM  TB_APRV  
          WHERE  APRV_DOC_ID  =  'A20220704100201'
              AND  APRV_ORD  IN  (4,5)
              AND  APRV_RJCT_YN  IS  NULL)  =  0  then
UPDATE  TB_APRV  SET  PROC_PRGM_ID  =  'TEST'
  WHERE  APRV_DOC_ID  =  'A20220704100201'
      AND  APRV_ORD  =  6  
      AND  SB_APRV_ORD  =  1
ELSE  
  UPDATE  TB_APRV  SET  PROC_PRGM_ID  =  'TEST'
    WHERE  APRV_DOC_ID  =  'A20220704100201'
        AND  APRV_ORD  =  5
        AND  SB_APRV_ORD  =  (1+1)
END  IF  

--  문장을  효율적으로  수정하려면,  어느  부분을  더  수정해야  할지  조건을  부탁드립니다.  

 

by 마농 [2022.07.04 10:28:06]

업데이트할 값을 변수에 담아 처리하면 UPDATE 문 한번만 쓰면 되겠네요.
그런데. 개인적인 의견입니다만.
count 조건이나 update 값이 뭔가 이상해 보이고, 불합리해 보입니다. 제 눈에는...


by 포동푸우 [2022.07.04 10:54:57]

업데이트 할 값을 변수에 담아 Update 문을 한번만 쓸 수 있다는 부분을 제가 이해를 못했네요.  혹시 좀 더 설명해 주실 수 있을까요 ?  


by 우리집아찌 [2022.07.04 10:59:08]

포동푸우님 안녕하세요~

MariaDB는 잘모르긴 하지만

Merge Into 문 쓰시는게 깔끔할것 같은데요.

update 할 row만 select 해서 넣으면 되니까요..


by 포동푸우 [2022.07.04 11:24:49]

Merge 로도 변경해 보겠습니다. 


by 마농 [2022.07.04 11:01:29]
-- 문법이 맞는지는 모르겠지만, 요런 형태..
 
IF 조건 THEN
  SET @v1 = 6;
  SET @v2 = 1;
ELSE
  SET @v1 = 5;
  SET @v2 = 2;
END IF;
 
UPDATE ...
   SET ...
 WHERE aprv_doc_id = 'A20220704100201'
   AND aprv_ord    = @v1
   AND sb_aprv_ord = @v2
;

 


by 포동푸우 [2022.07.04 11:24:10]

추가 설명 고맙습니다. 


by 마농 [2022.07.04 11:34:57]
-- 한 방 쿼리 --
UPDATE tb_aprv a
 INNER JOIN
       (SELECT CASE WHEN COUNT(*) = 0 THEN 6 ELSE 5 END aprv_ord
             , CASE WHEN COUNT(*) = 0 THEN 1 ELSE 2 END sb_aprv_ord
          FROM tb_aprv
         WHERE aprv_doc_id = 'A20220704100201'
           AND aprv_ord IN (4, 5)
           AND aprv_rjct_yn IS NULL
        ) b
    ON a.aprv_doc_id = 'A20220704100201'
   AND a.aprv_ord    = b.aprv_ord
   AND a.sb_aprv_ord = b.sb_aprv_ord
   SET proc_prgm_id  = 'TEST'
;

 


by 포동푸우 [2022.07.04 13:14:50]

이렇게도 되네요,, 고맙습니다. 

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