[oracle] SELECT 를 사용한 UPDATE 3

프로그래밍/DB 2010. 9. 14. 14:42 Posted by galad
UPDATE /*+ bypass_ujvc */
(
    SELECT
        CONTENT_ID,
        HDV_YN,
        META18 AS META_HDV_YN
    FROM
    (
        SELECT
            A.CONTENT_ID
            ,CASE
                WHEN COUNT(B.META02) > 0 THEN 'Y'
                ELSE 'N'
            END AS HDV_YN
            ,C.META18
        FROM
            SUB_CONTENT_META A, SUB_CONTENT_META_EXTEND B, CONTENT_META_EXTEND C
        WHERE
            A.SUB_CONTENT_ID = B.SUB_CONTENT_ID
            AND A.CONTENT_ID = C.CONTENT_ID
            AND B.META02 = 'PD009703'
    --        AND    A.CONTENT_ID = ''
        GROUP BY
            A.CONTENT_ID, C.META18
    )
)
SET META_HDV_YN = HDV_YN

CONTENT_META_EXTEND 의 컬럼을 업데이트하고 싶은데 위와 같이 안쪽(?)에서 뷰를 만들 때 같이 조인해버리면
"가상 열은 사용할 수 없습니다" 라는 에러가 난다.

아래처럼 실제 데이터 넣을 컬럼은 가장 외부로 뺄 것
참고: http://database.sarang.net/?inc=read&aid=35544&criteria=oracle&subcrit=&id=36136&limit=20&keyword=&page=50

[가상 Table에 정보를 저장(Insert) 하거나 변경(update)를 수행할 수 없지요

즉, UPDATE (SELECT....)

SELECT 부분이 실 Table이어야만 하지 Select된 결과에 대한 것은 변경이나 저장을

할 수 없는 것이지요.

따라서 Select 부분을 조건절로 보내고, 실 Table을 정의하시면 됩니다.]


UPDATE /*+ bypass_ujvc */
(
    SELECT
        T.CONTENT_ID,
        T.HDV_YN,
        C.META18 AS META_HDV_YN
    FROM
    (
        SELECT
            A.CONTENT_ID
            ,CASE
                WHEN COUNT(B.META02) > 0 THEN 'Y'
                ELSE 'N'
            END AS HDV_YN
        FROM
            SUB_CONTENT_META A, SUB_CONTENT_META_EXTEND B
        WHERE
            A.SUB_CONTENT_ID = B.SUB_CONTENT_ID
            AND B.META02 = 'PD009703'
            AND    A.CONTENT_ID = '0000024061'
        GROUP BY
            A.CONTENT_ID
    ) T, CONTENT_META_EXTEND C
    WHERE
        T.CONTENT_ID = C.CONTENT_ID
)
SET META_HDV_YN = HDV_YN;


'프로그래밍 > DB' 카테고리의 다른 글

[oracle] Windows 7 과 oracle, Toad  (0) 2011.03.09
[Tool] 토드 폰트 변경하기  (0) 2010.11.19
[oracle] select 문을 이용한 update 2  (0) 2010.08.16
[SQLite] Command Line Shell For SQLite  (0) 2010.05.24
[SQLite] Quick Start  (1) 2010.05.24

UPDATE /*+ bypass_ujvc */

(

           SELECT A.CATEGORY_ID

           FROM DEPLOY_PRODUCT_CATEGORY A, PRODUCT_INFO B

           WHERE A.CATEGORY_ID LIKE '%DP070%'

                     AND A.PRODUCT_ID = B.PRODUCT_ID

                     AND B.STATUS LIKE '6%'

)

SET CATEGORY_ID = 'XXXXXXXX';

/*+ bypass_ujvc */ 이 부분 필수임.

다음과 같이 SELECT에서 2개의 컬럼을 가져다가 넣는 것도 가능

update /*+ bypass_ujvc */

(
   select e.PRODUCT_ID, e.PROD_DESC o_PROD_DESC,f.PROD_DESC N_PROD_DESC
   from (
     select b.CHANNEL_ID,c.PRODUCT_ID,max(d.PROD_DESC) PROD_DESC
     from PRODUCT_INFO a, PRODUCT_CATEGORY b, PRODUCT_INFO c, TBL_DP_PROD d
     where a.CONTENT_TYPE='09'
       and a.PRODUCT_ID = b.CHANNEL_ID
       and b.PRODUCT_ID = c.PRODUCT_ID
       and b.PRODUCT_ID <> b.CHANNEL_ID
       and b.CHANNEL_ID = d.PROD_ID
    group by b.CHANNEL_ID,c.PRODUCT_ID
  ) e, TBL_DP_PROD f
  where e.PRODUCT_ID = f.PROD_ID

    and f.PROD_DESC is null
)

set N_PROD_DESC = o_PROD_DESC



UPDATE TBL_US_MEMBER
SET
OP_HP_NO = (SELECT REPLACE(OP_HP_NO, '-', '') FROM TBL_US_MEMBER A WHERE TBL_US_MEMBER.MBR_NO = A.MBR_NO)
WHERE MBR_CAT_CD = 'US000207'

'프로그래밍 > DB' 카테고리의 다른 글

[oracle] 쿼리 결과를 파일로 출력하기  (0) 2010.05.20
[oracle] ' 포함한 쿼리  (0) 2010.04.09
[oracle] 제약조건 확인하기  (0) 2010.02.25
[Toad] tab 간격 조정하기  (0) 2010.02.02
[ORACLE] 특수문자 입력  (0) 2009.10.21