2011년 8월 4일 목요일

[oracle] CONNECT BY 연산자 사용방법


1부터 5까지 출력쿼리

SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 5;

SELECT ROWNUM FROM DUAL CONNECT BY LEVEL <= 5;

출력
 1
 2
 3
 4
 5

 10부터 15까지 출력쿼리
SELECT LEVEL+9 FROM DUAL CONNECT BY LEVEL+9 < 16;
SELECT ROWNUM+9 FROM DUAL CONNECT BY LEVEL+9 < 16;

출력
 10
11
12
13
14
15

 20060101일부터 20060105일까지 출력쿼리
 SELECT TO_DATE('20060101', 'YYYYMMDD') + LEVEL - 1 FROM DUAL
 CONNECT BY LEVEL <= 10;

출력
 2006-01-01
2006-01-02
2006-01-03
2006-01-04
2006-01-05

 2003년부터 2007년까지 출력쿼리
 SELECT TO_CHAR(TO_CHAR(sysdate,'yyyy') -5 + ROWNUM) yyyy FROM dual
 CONNECT BY LEVEL <= 5;

출력
 2003
2004
2005
2006
2007

 ※ MySQL에서는 Connect By와 같은 효과를 낼수 없다.(꼬진 DBMS)

10개의 로우가 있는 테이블에 컬럼(NAME)을 추가하고 1부터 10을 넣는 방법
UPDATE 테이블 SET NAME = (SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 10);

1000~9999까지의 숫자중에 4개의 숫자합이 7이 되는 수는 몇개인지 체크하는 쿼리
 
select count(1) from (
 select * from
   (
   select
       num,
       trunc(num/1000) as first,
       trunc(mod(num,1000)/100) as second,
       trunc(mod(num,100)/10) as third,
       mod(num,10) as forth
   from (
     select 999+rownum as num from dual connect by level+999<10000
   )
 ) where first+second+third+forth = 7
 or first+second+third+forth in (07, 16, 25, 34, 43, 52, 61, 70)
 -- 4자리 수의 총합이 두자리인 경우는 다시 더한다고 가정
 );

 테이블에 테스트 데이타 쉽게 넣기
 
select level,dbms_random.string('A',20)
 from dual
 connect by level < 1000; <- 1000이라는 수치만 변경하면 됨
 
또는

 INSERT INTO test (a,b)
 SELECT NVL(a, 0) + level as a, 'aaa' || to_char(NVL(a, 0) + level) as b
 FROM (SELECT MAX(a) as a FROM test)
 CONNECT BY LEVEL <= 10; <- 10이라는 수치만 변경하면 됨

댓글 없음:

댓글 쓰기