Update 쿼리 질문입니다. 0 4 1,246

by 김동욱 [PL/SQL] [2015.12.30 16:00:03]


update a
set (1, 2, 3)=
  ( select 1, 2, 3
      from a, b
     where a.조건1 = b.조건1      -- 조건1
       and a.조건2 = b.조건2       -- 조건2
       and b.조건3 in (400, 999)
       and b.조건4 in (220, 400)
   );
  

하위 쿼리시 조건에 맞는값을 한줄씩 update 진행하려고 하는데 서브쿼리 결과값이 많이 나오네요

조건1, 조건2에 맞는 값을 빼서 한줄씩 update를 진행하여야 하는데 잘모르겠네요............

 

by 아발란체 [2015.12.30 16:07:54]

얼렝.. (1, 2, 3)은?? 뭐에영? 항목명이 1, 2, 3인가용? (a, b, c)식의 일반적인 구문으로 기술 주셔야 할 것 같은데.. ㅠㅠ 저리 쓰시면 기본 문법은 이해하신 것인지 확인이... 아무튼 테이블 조인하며 업데이트 하는 구문은 아래와 같습니다.

UPDATE (
	SELECT
		T1.A, T1.B, T2.C, T2.D
	FROM
		T1, T2
	WHERE
		T1.A = T2.C
) SET
	B = D

 


by 아발란체 [2015.12.30 16:09:36]

근데 이렇게 해서 키 보존 어쩌고 저쩌고 오류가 발생하면, 조건절에 있는 항목이 키로 보장되지 않아서 그런 것이며 무시하고 업데이트 하실려면 업데이트 구문에 힌트로 다음을 주면 됩니다.

UPDATE  /*+bypass_ujvc*/ (.....

 


by 마농 [2015.12.30 16:40:50]

메인의 a 가 서브의 b 에 조건으로 주어져야 합니다.

그런데 서브에 a 가 또 있네요.

서브의 FROM 절에 a 를 제거하고 b 만 남기세요.

이 때 주의할 점은 a의 갱신 대상 건수입니다.

전체 대상으로 갱신하는게 아니라면 조건절 필수로 줘야 합니다.

조건절은 마찬가지 서브쿼리 방식으로 IN 이나 EXISTS 를 사용하면 됩니다.

UPDATE a
   SET (1, 2, 3)
     = (SELECT 1, 2, 3
--        FROM a, b
          FROM b    -- a 제거
         WHERE b.조건1 = a.조건1       -- 조건1
           AND b.조건2 = a.조건2       -- 조건2
           AND b.조건3 IN (400, 999)
           AND b.조건4 IN (220, 400)
         )
 WHERE EXISTS
       (SELECT 1
          FROM b
         WHERE b.조건1 = a.조건1       -- 조건1
           AND b.조건2 = a.조건2       -- 조건2
           AND b.조건3 IN (400, 999)
           AND b.조건4 IN (220, 400)
         )
;

 


by atumlee [2015.12.30 16:58:33]
/*
bypass_ujvc 힌트는 11g 부터는 지원 안되는 걸로 알고 있는데, 확인을 해보셔야 할 것 같습니다.
그리고, 김동욱님이 제시하신 내용만으로는 정확한 파악이 어려워서 다음과 같은 가정을 했습니다.

1. [테이블A], [테이블B]의 구조
    [테이블A] = "조건1", "조건2", "변경1", "변경2", "변경3"
    [테이블B] = "조건1", "조건2", "조건3", "조건4", "변경1", "변경2", "변경3", "날짜"

2. [테이블A] : [테이블B] = 1:M 관계

3. 변경하고자 하는 [테이블A]의 "변경1", "변경2", "변경3" 칼럼은 대응하는 [테이블B]에서
   "날짜" 칼럼을 사용해서 가장 최근 데이터를 반영
   ("날짜"가 아니더라도 [테이블A]와 [테이블B]가 1:1 관계가 될 수 있도록 적절한 기준을 반영합니다)
*/
MERGE INTO 테이블A ORG
USING   (
        SELECT  A.*
        FROM    (
                SELECT  A.ROWID AS RID, B.변경1, B.변경2, B.변경3
                      , ROW_NUMBER() OVER (PARTITION BY A.ROWID ORDER BY B.날짜 DESC) AS RNK
                FROM    테이블A A
                        INNER JOIN 테이블B B
                            ON  B.조건1 = A.조건1 AND B.조건2 = A.조건2
                            AND B.조건3 IN (400,999) AND B.조건4 IN (220,400)
                ) A
        WHERE   A.RNK   = 1
        ) TAR
ON      (ORG.ROWID = TAR.RID)
WHEN MATCHED THEN
        UPDATE SET ORG.변경1 = TAR.변경1, ORG.변경2 = TAR.변경2, ORG.변경3 = TAR.변경3
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입