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
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 ) ;
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 넣고싶은데 ㅠ방법이있을까요
1. K_DEPT1 은 혹시 N_DEPT1 의 오타인가요?
- N_DEPT1 이 맞다면? 쿼리가 간결해 질 수 있습니다.
- K_DEPT1 이 맞다면? 쿼리가 복잡해 집니다.
2. Join Update 구문은
- DBMS 마다 문법이 다릅니다.
- 위 구문은 MSSQL 용 구문이네요.
- http://gurubee.net/article/79308
아 오타입니다 수정했습니다..
올려주신 방법을보니까 서브쿼리로 사용할려고하는데요
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가 같아야하는데
위에조건토대로 도와주시면정말 감사하겠습니다 ㅠ
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 ) ;