머지문에서 SELECT 후 UPDATE,INSERT 하는방법 질문 0 9 393

by 겸둥이k [SQL Query] SELECT INSERT SELECT UPDATE [2019.04.03 14:29:08]


MERGE INTO T_SCHEDULE
	USING DUAL
ON (DEPT=#{dept} AND DATA_NUM=#{dataNum} AND 
		WHEN MATCHED THEN
UPDATE  SET
		  GN_NAME	=	#{gnName ,jdbcType=VARCHAR}
	WHEN NOT MATCHED THEN
INSERT (
                 DATA_NUM,
                 GN_NAME
		GN_NAME
         )
			VALUES (
               #{dataNum ,jdbcType=VARCHAR}, 
              #{gnName ,jdbcType=VARCHAR}  

                        )

저상태에서 INSERT 문과 update 문에 SELECT 후 할수있나요?

아래 형태로 넣고싶은데요

MERGE INTO T_SCHEDULE
	USING DUAL
ON (DEPT=#{dept} AND DATA_NUM=#{dataNum} AND 
		WHEN MATCHED THEN
UPDATE  SET
		  GN_NAME	=	#{gnName ,jdbcType=VARCHAR},
         (SCH_SEQ3,NETWORK_CON) =(SELECT FCTY_ID,INST_S  FROM T_FCTY)
	WHEN NOT MATCHED THEN
INSERT (
         DATA_NUM,
		GN_NAME,
        SCH_SEQ3,
        NETWORK_CON
         )
			VALUES (
               #{dataNum ,jdbcType=VARCHAR}, 
              #{gnName ,jdbcType=VARCHAR},    
         SELECT
                 MIN(FCTY_ID),
				MIN(INST_S),
                FROM 
              T_FCTY

 

by 마농 [2019.04.03 14:40:27]

USING 절에 dual 쓰지 말고 SELECT 문을 쓰세요.

MERGE INTO t_schedule a
USING
(
SELECT #{dept}      dept
     , #{dataNum}   data_num
     , #{gnName}    gn_name
     , MIN(fcty_id) sch_seq3
     , MIN(inst_s)  network_con
  FROM t_fcty
) b
ON (a.dept = b.dept AND a.data_num = b.data_num)
WHEN MATCHED THEN
UPDATE
   SET a.gn_name     = b.gn_name
     , a.sch_seq3    = b.sch_seq3
     , a.network_con = b.network_con
WHEN NOT MATCHED THEN
INSERT ( dept
       , data_num
       , gn_name
       , sch_seq3
       , network_con
       )
VALUES ( b.dept
       , b.data_num
       , b.gn_name
       , b.sch_seq3
       , b.network_con
       )
;

 


by 겸둥이k [2019.04.03 16:22:19]

답변감사합니다 위에말씀 즉 select 안에  컨트롤러에서 넘긴 파라미터들과  t_fcty 테이블 정보들을 그대로 적어주면된다는 말씀이신가요? 아래쿼리문처럼

SELECT 
       #{dept}      dept
     , #{dataNum}   data_num
     , #{gnName}    gn_name
     , MIN(fcty_id) sch_seq3
     , MIN(inst_s)  network_con
  FROM t_fcty

 


by 마농 [2019.04.03 16:38:38]

올려 주신 쿼리 보고 그대로 작성한 쿼리입니다.
다만, 올려주신 쿼리가 완성형이 아닌 듯 한 느낌이 드네요.
업무 요건에 맞게 쿼리를 완성하셔야 할 것 같습니다.


by 겸둥이k [2019.04.03 18:03:25]
UPDATE T_SCHEDULE A
			 		SET
						 NETWORK_CON =	B.INST_S,
						IP = B.PUBLIC_IP,
						MODEM_CNT = B.MODEM_CNT,
						INSTR_CNT = B.METER_CNT,
						M_COMPANY = B.M_COMPANY,
						FROM(SELECT INST_S,PUBLIC_IP,MODEM_CNT,METER_CNT,M_COMPANY FROM T_FCTY) AS B
		WHERE 	
			 B.DCU_ID = A.DCU_ID
			AND B.N_DEPT1 = A.N_DEPT1
			AND B.N_DEPT2 = A.N_DEPT2
			AND B.DEPT1= A.DEPT1
			AND B.DEPT2= A.DEPT2	
			AND B.BUSI_DIV= A.BUSI_DIV
			AND B.DCU_ID =#{dcuId}
			AND B.N_DEPT1 = #{nDept1}
			AND B.N_DEPT2 = #{nDept2}
			AND B.DEPT1= #{dept1}
			AND B.DEPT2= #{dept2}	
			AND B.BUSI_DIV= #{busiDiv}	

답변감사합니다. 혹시 SELECT UPDATE 문도 알려주실수있을까요 인터넷에서는 저렇게 하라는데 ㅠ 안돼네요

각자 하나에대한 서브쿼리는 너무 많이돌리니깐 셀렉트문  하나에 T_SCHEDULE  넣고싶은데 ㅠ방법이있을까요


by 마농 [2019.04.04 08:41:53]

1. K_DEPT1 은 혹시 N_DEPT1 의 오타인가요?
 - N_DEPT1 이 맞다면? 쿼리가 간결해 질 수 있습니다.
 - K_DEPT1 이 맞다면? 쿼리가 복잡해 집니다.
2. Join Update 구문은
 - DBMS 마다 문법이 다릅니다.
 - 위 구문은 MSSQL 용 구문이네요.
 - http://gurubee.net/article/79308


by 겸둥이k [2019.04.04 09:33:18]

아 오타입니다 수정했습니다..

올려주신 방법을보니까 서브쿼리로 사용할려고하는데요 

UPDATE emp e
   SET e.dname = (SELECT d.dname FROM dept d WHERE d.deptno = e.deptno)
 WHERE EXISTS (SELECT 0 FROM dept d WHERE d.deptno = e.deptno)
;

이방법 토대로 사용할려고하는데요 

		UPDATE T_SCHEDULE A
   SET (
     A.SCH_SEQ3,
        A.NETWORK_CON,
        A.IP,
        A.MODEM_CNT,
        A.INSTR_CNT,
        A.M_COMPANY,
        A.GAETONG_ID,
        A.GAETONG_DATE) =
          (SELECT 
                  ID,
                  INST_S,
                  PUBLIC_IP,
                  MODEM_CNT,
                  METER_CNT,
                  M_COMPANY,
                  REG_ID,
                  REG_DATE
             FROM T_FCTY B
            WHERE 
          		       조건	)
	WHERE	 조건

 

위에 조건을 뭐라고해야할지 감이 안잡힙니다. ㅠ 어떻게 쓰면될까요?  위에방법에서는 d.deptno = e.deptno 이렇게만 조건이 있지만 저는 파라미터로 넘긴거 기준에 검색하고 A하고 B가 같아야하는데 

위에조건토대로 도와주시면정말 감사하겠습니다 ㅠ


by 마농 [2019.04.04 09:46:35]
UPDATE t_schedule a
   SET ( sch_seq3
       , network_con
       , ip
       , modem_cnt
       , instr_cnt
       , m_company
       , gaetong_id
       , gaetong_date
       )
     = (SELECT b.id
             , b.inst_s
             , b.public_ip
             , b.modem_cnt
             , b.meter_cnt
             , b.m_company
             , b.reg_id
             , b.reg_date
          FROM t_fcty b
         WHERE b.dcu_id   = a.dcu_id
           AND b.n_dept1  = a.n_dept1
           AND b.n_dept2  = a.n_dept2
           AND b.dept1    = a.dept1
           AND b.dept2    = a.dept2
           AND b.busi_div = a.busi_div
        )
 WHERE a.dcu_id   = #{dcuId}
   AND a.n_dept1  = #{nDept1}
   AND a.n_dept2  = #{nDept2}
   AND a.dept1    = #{dept1}
   AND a.dept2    = #{dept2}
   AND a.busi_div = #{busiDiv}
   AND EXISTS
       (SELECT 1
          FROM t_fcty b
         WHERE b.dcu_id   = a.dcu_id
           AND b.n_dept1  = a.n_dept1
           AND b.n_dept2  = a.n_dept2
           AND b.dept1    = a.dept1
           AND b.dept2    = a.dept2
           AND b.busi_div = a.busi_div
        )
;

 


by 겸둥이k [2019.04.04 11:18:35]

답변감사합니다. 저기 조건에서 만약 서브 쿼리값이 있을때만 돌아라 할려면 

제일 아래 조건에 AND EXISTS (SELECT 0 FROM dept d WHERE d.deptno = e.deptno) 이런식으로 추가하면될까요?


by 마농 [2019.04.04 11:25:34]

네. set 절에서 사용한 서브쿼리 그대로 Exists 절에서 이용하시면 됩니다.

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