쿼리 재질문드립니다. 0 6 2,366

by 강서꽃미남 [2014.06.26 15:50:38]


캡처.PNG (13,241Bytes)

 

먼저, 감사합니다. 앞에 질문사항에서 힌트를 주셔서 거의 해결했습니다.

마지막으로 한가지 더 질문드리겠습니다.

계층쿼리를 이용해서 밑에 있는 로우의 컬럼이름과 타입을 가져다가 테이블 생성 스크립트를 만들고 싶은데요..

돌려보면 아시겠지만, rm이 1일경우 script 를 뽑게 되어 있습니다. 

근데 지금 쿼리대로라면 각 행마다 실행이 되서요, rm1인 곳에서 모두 밑에 컬럼들도 뽑고 싶은데요.

조언 부탁드립니다.

 

SELECT 
           CASE
            WHEN RM ='1' THEN TABLE_NAME ELSE '' END TABLE_NAME
         , COLUMN_ID
         , COLUMN_NAME
         , DATA_TYPE
         , DATA_LENGTH
         , TARGET
         , CASE
            WHEN RM ='1' THEN 'CREATE TABLE'|| TABLE_NAME ||' ( '||COLUMN_NAME || ' (' || '),' ELSE '' END SCRIPT
      FROM 
    (
        SELECT    TABLE_NAME
                , COLUMN_ID
                , COLUMN_NAME
                , DATA_TYPE
                , DATA_LENGTH
                , CASE 
                       -- 문자형
                       WHEN DATA_TYPE = 'VARCHAR2' AND DATA_LENGTH = '200' AND SUBSTR(TABLE_NAME,1,2) ='IF' THEN 'VARCHAR(255)'
                       WHEN DATA_TYPE = 'VARCHAR2' AND DATA_LENGTH > '256' THEN 'TEXT'
                       WHEN DATA_TYPE = 'VARCHAR2' AND DATA_LENGTH < '254' THEN 'VARCHAR('||DATA_LENGTH||')'               
                       -- 날짜형
                       WHEN DATA_TYPE = 'DATE' THEN 'TIMESTAMP'
                       -- 숫자형
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'LVL' THEN 'TINYINT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%_LEVEL' THEN 'TINYINT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'COLOR_SIGNAL_ID' THEN 'TINYINT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'SUCCESS_QTY' THEN 'INT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'FAIL_QTY' THEN 'INT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'UPDATE_QTY' THEN 'INT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%SEQ' THEN 'INT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%_CNT' THEN 'INT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%_QTY' THEN 'INT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%RATIO' THEN 'FLOAT'
                       WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%RATE' THEN 'FLOAT'
                  ELSE 'BIGINT' 
                  END TARGET
               , ROW_NUMBER () OVER (PARTITION BY TABLE_NAME ORDER BY TABLE_NAME) RM
          FROM USER_TAB_COLUMNS
          WHERE TABLE_NAME <> 'PLAN_TABLE'
            AND TABLE_NAME <> 'PLSQL_ARCHIVE'
       ORDER BY 1,2 
    )

 

by DarkBee [2014.06.26 16:06:06]
하나의 ROW에 테이블 스크립트 전체를 넣겠다는 얘긴가...


        SELECT     TABLE_NAME
                 , 'CREATE TABLE ' || TABLE_NAME
                || '('
                || LISTAGG ( column_name || ' ' || target, ', ' ) WITHIN GROUP (ORDER  BY COLUMN_ID)
                || ') ;'
              FROM ( 위쿼리 ) GROUP BY table_name

 


by 강서꽃미남 [2014.06.26 16:17:14]

네 맞습니다.. 모르는 함수가.. 많네요 ㅠㅠ

 

감사합니다. 계속고민하고 있었어요 


by 강서꽃미남 [2014.06.26 16:21:22]

 LISTAGG (column_name || ' ' || target, ', ')    WITHIN GROUP (ORDER BY COLUMN_ID)

이건 그럼 , 으로 구분한단뜻인가요?


by DarkBee [2014.06.26 16:26:14]

ㅇㅇ


by 강서꽃미남 [2014.06.26 16:27:19]

확인했습니다. 그냥 이어주려고 쓰신거네요..감사합니다 덕분에 새로운 함수 알아가요!


by 시골간아찌 [2014.06.26 17:26:04]

꽃미남이 밥 사는겨??

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