SQL 정리 요약

SQL 관련 2017. 7. 17. 16:34

 ◎ DISTINCT : 중복된 데이터를 제거한다.

- 1개의 칼럼에만 적어도 모든 칼럼에 적용된다. 이로 인행 뜻하지 않은 성능 저하가 발생 할 수 있으니

  주의해서 사용   

 참고: 9I 버전까지는 정렬을 수행해서 심각한 속도 저하가 발생 했으나 10g 버전부터  HASH 알고

 리즘 사용하는 방식으로 변경되어 성능이 많이 향됨

◎ 집합연산자의 4가지 종류

연산자의  종류

내용

 UNION 

두 집합을 더해서 결과를 출력 중복 값 제거하고 정렬

 UNION_ALL

두 집합을 더해서 결과를 출력, 중복 값을 제거 안 하고 정렬 안함

 INTERSECT

두 집합의 교집합 결과를 출력 정렬함

 MINUS

두 집합의 차집합 결과를 출력 정렬함 쿼리의 순서 중요함

- 집합 연산산자 사용에 주의할 사항.

 1) 두집합의 SELECT 절에 오는 컬럼의 개수가 동일 해야함

 2) 칼럼의 데이터 타입이 동일해야함

 3)  두집합의 컬러명이 달라도 사용가능

 

◎ 문자함수

▶ INITCAP - 입력 값의 첫 글짜만 대문자로 변환
   예제) INITCAP('abcd')  결과: Abcd
  
▶ LOWER - 입력 값을 전부 소문자로 변환
   예제) LOWER('ABCD')  결과: abcd

▶ UPPER - 입력 값을 전부 대문자로 변환
   예제) UPPER('abcd')  결과: ABCD
  
▶ LENGTH - 입력된 문자열의 길이를 계산해주는 함수
   예제) LENGTH('한글')  결과: 2

▶ LENGTHB - 입력된 문자열의 길이 바이트값 반환
   예제) LENGTHB('한글')  결과: 4
  
▶ CONCAT - 두 문자열을 결합해서 출력( || 와 동일)
   예제) CONCAT('A','B') 결과: AB

▶ SUBSTR = 문자열에서 특정 길이의 문자를 추출할 때 사용
   예제) SUBSTR('한글',1,2)) 결과: 한    
 
▶ SUBSTRB - 주어진 문자에서 특정 바이트만 추출
   예제) SUBSTRB('한글',1,2)) 결과: 한글      

▶ INSTR - 주어진 문자에서 특정 문자위치 추출
   예제) INSTR('A*B#','#') 결과: 4

▶ INSTRB - 주어진 문자에서 특정 문자 위치 바이트값 추출
   예제) INSTRB('한글로','로') 결과: 5
  
▶ LPAD - 주어진 문자열에서 왼쪽으로 특정 문자를 채움
   예제) LPAD('love.','6,'*')  결과: **love
  
▶ RPAD - 주어진 문자열에서 오른쪽으로 특정 문자를 채움
   예제) RPAD('love.','6,'*')  결과: love**  

▶ LTRIM - 주어진 문자열에서 왼쪽의  특정 문자를 삭제함
   예제) LTRIM('*love'.'*')  결과: love 

▶ RTRIM - 주어진 문자열에서 오른쪽의  특정 문자를 삭제함
   예제) LTRIM('love*'.'*')  결과: love
  
▶ REPLACE- 주어진 열에서 A를 B로 치환함
   예제) REPLACE('AB'.'A','E')  결과: EB

Posted by 달콤한부자
,

날짜 관련 SQL

SQL 관련 2016. 7. 14. 08:42

     SELECT TO_CHAR(SYSDATE,'YYYYMMDD') today,
               TO_CHAR(SYSDATE -1,'YYYYMMDD')  yesterday,
               TO_CHAR(SYSDATE,'MONTH DD, YYYY') yearmonth,
               TO_CHAR(SYSDATE,'YYYY.MM.DD HH24:MI:SS') fullyear,
               TO_CHAR(SYSDATE,'MONTH')  month,
               TO_CHAR(SYSDATE,'MON')    mon,
               TO_CHAR(SYSDATE,'DAY')    daykor ,
               TO_CHAR(SYSDATE,'DY')     daykor1,
               TO_CHAR(SYSDATE,'A.M.')   am,
               TO_CHAR(SYSDATE,'HH')     hh,
               TO_CHAR(SYSDATE,'MI')     mi,
               TO_CHAR(SYSDATE,'SS')     ss,
               TO_CHAR(SYSDATE,'YYYYMM')||'01'  startyear,
               TO_CHAR(LAST_DAY(SYSDATE),'YYYYMMDD')  lastday,
               TO_CHAR(SYSDATE -7,'YYYYMMDD')         lastweek,
               TO_CHAR(SYSDATE +7,'YYYYMMDD')         nextweek,
               TO_CHAR(SYSDATE -14,'YYYYMMDD')        twolast,
               TO_CHAR(SYSDATE +14,'YYYYMMDD')        twonext,
               TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYYMMDD')  lastmonth,
               TO_CHAR(ADD_MONTHS(SYSDATE,-2),'YYYYMMDD')  twolastmon,
               TO_CHAR(ADD_MONTHS(SYSDATE,-3),'YYYYMMDD')  threelastmon,
               TO_CHAR(ADD_MONTHS(SYSDATE,1),'YYYYMMDD')   nextmonth,
               TO_CHAR(ADD_MONTHS(SYSDATE,1)-1,'YYYYMMDD') yesterday,
               TO_CHAR(ADD_MONTHS(SYSDATE,-12),'YYYYMMDD') lastyear,
               TO_CHAR(ADD_MONTHS(SYSDATE,12),'YYYYMMDD')  nextyear,
               TO_CHAR(SYSDATE,'YYYYMMDDHHMISS')           fulltime,
               TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')         fulltime1,
               TO_CHAR(SYSDATE +7,'YYYYMMDDHH24MISS')      ,
               TO_CHAR(SYSDATE,'YYYY/MM/DD')               ,
               TO_CHAR(SYSDATE+1,'YYYYMMDDHHMISS')         ,
               TO_CHAR(SYSDATE,'YYYY')||'01'||'01'         startday1,
               TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'))-1)||'01'||'01' lastyearstartday,
               TO_CHAR(SYSDATE,'YYYY')||'12'||'31'     lastday,
               TO_CHAR(SYSDATE,'YYYY')                 year,
               SUBSTR(TO_CHAR(SYSDATE,'YYYY'),2,3)     year,
               to_char(add_months(sysdate,-11),'YYYYMMDD') last11mon
       FROM DUAL;

Posted by 달콤한부자
,

부서별 건수

SQL 관련 2015. 3. 10. 10:51

SELECT
   ORG_NAME,
   SUM(DECODE(YEAR,'13',NVL(REPORT,0)))   R_13,
   SUM(DECODE(YEAR,'14',NVL(REPORT,0)))   R_14,
   SUM(DECODE(YEAR,'13',NVL(DOC_TYPE,0))) A_13,
   SUM(DECODE(YEAR,'14',NVL(DOC_TYPE,0))) A_14,
   SUM(DECODE(YEAR,'13',NVL(BEFORE,0)))   B_13,
   SUM(DECODE(YEAR,'14',NVL(BEFORE,0)))   B_14,
   SUM(DECODE(YEAR,'13',NVL(RENT,0)))     R_13,
   SUM(DECODE(YEAR,'14',NVL(RENT,0)))     R_14
FROM(
       SELECT 
          SUBSTR(OWNER_DEPT_DOC_NO,1,5) ORG_NAME,
          SUBSTR(OWNER_DEPT_DOC_NO,8,2) YEAR,
          COUNT(*) REPORT,
          NULL DOC_TYPE,
          NULL BEFORE,
          NULL RENT
       FROM S_SALE_PROMOTION
       WHERE SUBSTR(OWNER_DEPT_DOC_NO,8,2) IN ('13','14')
          AND SUBSTR(OWNER_DEPT_DOC_NO,1,2) ='SA'
       GROUP BY
          SUBSTR(OWNER_DEPT_DOC_NO,1,5),
          SUBSTR(OWNER_DEPT_DOC_NO,8,2)
       UNION ALL  
       SELECT 
          SUBSTR(OWNER_DEPT_DOC_NO,1,5) ORG_NAME,
          SUBSTR(OWNER_DEPT_DOC_NO,8,2) YEAR,
          NULL REPORT,
          COUNT(*) DOC_TYPE,
          NULL BEFORE,
          NULL RENT
       FROM S_SALE_PROMOTION
       WHERE DOC_TYPE_SUB ='AFTER'
          AND SUBSTR(OWNER_DEPT_DOC_NO,8,2) IN ('13','14')
          AND SUBSTR(OWNER_DEPT_DOC_NO,1,2) ='SA'
       GROUP BY
          SUBSTR(OWNER_DEPT_DOC_NO,1,5),
          SUBSTR(OWNER_DEPT_DOC_NO,8,2)
       UNION ALL
       SELECT
          SUBSTR(OWNER_DEPT_DOC_NO,1,5) ORG_NAME,
          SUBSTR(OWNER_DEPT_DOC_NO,8,2) YEAR,
          NULL REPORT,
          NULL DOC_TYPE,
          COUNT(*) BEFORE,
          NULL RENT
       FROM S_SALE_PROMOTION
       WHERE SUBSTR(OWNER_DEPT_DOC_NO,8,2) IN ('13','14')
          AND BEFORE_PAY_FLG ='Y'
          AND SUBSTR(OWNER_DEPT_DOC_NO,1,2) ='SA'
       GROUP BY
          SUBSTR(OWNER_DEPT_DOC_NO,1,5),
          SUBSTR(OWNER_DEPT_DOC_NO,8,2),
          BEFORE_PAY_FLG
       UNION ALL
       SELECT
          SUBSTR(OWNER_DEPT_DOC_NO,1,5) ORG_NAME,
          SUBSTR(OWNER_DEPT_DOC_NO,8,2) YEAR,
          NULL REPORT,
          NULL DOC_TYPE,
          NULL BEFORE,
          COUNT(*) RENT       
       FROM S_SALE_PROMOTION
       WHERE SUBSTR(OWNER_DEPT_DOC_NO,8,2) IN ('13','14')
          AND  CARD_RENT_PAY_FLG='Y'
          AND SUBSTR(OWNER_DEPT_DOC_NO,1,2) ='SA'
       GROUP BY
          SUBSTR(OWNER_DEPT_DOC_NO,1,5),
          SUBSTR(OWNER_DEPT_DOC_NO,8,2)
    )
GROUP BY
   ORG_NAME
        

Posted by 달콤한부자
,

SELECT
    PART_NAME,
    PM_NAME,
    AM_NAME,
    REPLACE(REPLACE(PROD_NAME,CHR(13),''),CHR(10),'')PROD_NAME,
    NULL PROD_NAME_SALE_AMT_14 ,
    NULL PROD_NAME_SALE_AMT_15 ,
    NULL PROD_NAME_SALE_14_15_RATE,
    SUM(NVL(MON_TT,0)) PROD_BURGET,
    NULL PROD_BURGET_RATE,
    SUM(DECODE(TYPE,'학회(Booth)' ,NVL(MON_TT,0))) BURGET_T_01,
    SUM(DECODE(TYPE,'제품설명회'  ,NVL(MON_TT,0))) BURGET_T_02,
    SUM(DECODE(TYPE,'세미나'      ,NVL(MON_TT,0))) BURGET_T_03,
    SUM(DECODE(TYPE,'학술마케팅'  ,NVL(MON_TT,0))) BURGET_T_04,
    SUM(DECODE(TYPE,'임상연구비'  ,NVL(MON_TT,0))) BURGET_T_05,
    SUM(DECODE(TYPE,'교육(영업자)',NVL(MON_TT,0))) BURGET_T_06,
    SUM(DECODE(TYPE,'고객관리'    ,NVL(MON_TT,0))) BURGET_T_07,
    SUM(DECODE(TYPE,'홍보물제작'  ,NVL(MON_TT,0))) BURGET_T_08,
    SUM(DECODE(TYPE,'Sample'      ,NVL(MON_TT,0))) BURGET_T_09,
    SUM(DECODE(TYPE,'Device제작'  ,NVL(MON_TT,0))) BURGET_T_10,
    SUM(DECODE(TYPE,'소모품'      ,NVL(MON_TT,0))) BURGET_T_11,
    SUM(DECODE(TYPE,'PM운영'      ,NVL(MON_TT,0))) BURGET_T_12,
    SUM(DECODE(TYPE,'PM교육'      ,NVL(MON_TT,0))) BURGET_T_13,
    SUM(DECODE(TYPE,'인센티브'    ,NVL(MON_TT,0))) BURGET_T_14
FROM TOTAL_BURGET_M
GROUP BY
    PART_NAME,
    PM_NAME,
    AM_NAME,
    REPLACE(REPLACE(PROD_NAME,CHR(13),''),CHR(10),'')
ORDER BY
    PART_NAME,
    PM_NAME,
    AM_NAME,
    REPLACE(REPLACE(PROD_NAME,CHR(13),''),CHR(10),'')

'SQL 관련' 카테고리의 다른 글

날짜 관련 SQL  (0) 2016.07.14
부서별 건수  (0) 2015.03.10
SUM()함수에서 NULL값의 처리  (0) 2014.12.11
계층형 쿼리 ( START WITH ... CONNECT BY )  (0) 2014.09.29
유용한 쿼리 #1  (0) 2014.09.29
Posted by 달콤한부자
,

SUM()함수에서 NULL값의 처리

 

 

컬럼값이 NULL인 경우 사칙연산을 할 경우 결과값은 모두 NULL이 되게 된다. 이런 결과로,

SUM()함수에서 NULL값의 공포로 인해 우리가 함부로 NVL()함수를 사용하면 비효휼이 발생한다.

 

예를 들어 아래의 경우를 살펴보자.

 

 

SUM(NVL(COL1,0))

 

 

여기서 COL1 컬럼은 SUM()함수에 의하여 연산이 된다. 연산중 NULL값이 있어 전체 결과가 NULL값이 될까 두려워 이렇게 사용했다면 이것은 잘못된 생각이다.

SUM()함수에서 단일 컬럼이 연산이 될 때에는 NULL값은 연산의 대상에서 제외된다. NULL값이 연산을 하지 않았으므로 결과는 절대 NULL값이 되지 않는다. 위 처럼 NVL()함수를 사용하여 NULL값을 가진 경우 '0'으로 바꾸어도 결과는 동일하다. 그러니 SUM()함수 내에 NVL()를 쓰는 것은 불필요한 연산만 증가시키는 것이다.

'0'을 더하는 것도 연산이기 때문이다. 예를 들어 SUM()함수를 이용할 Row가 10만이고 그중 NULL값을 가진 경우가 9만이라고 한다면 불필요한 연산을 9만번이나 더 수행하는 것이 된다.

 

사실 이와 같은 잘못을 저지르는 이유는 NULL값의 연산에 대한 무지보다는 최종으로 추출되는 결과가 NULL값인 겨우에 화면에 공백이 추출되어 보이므로 이를 '0'으로 채우고 싶어서 그렇게 한 경우일 것이다.

그렇다면 이런 경우는 아래와 같이 하여야 한다.

 

 

NVL(SUM(COL1),0)

 

 

바로 위 문장은 앞선 위의 경우와 큰 차이가 없어 보이지만 처리할 일의 양에는 큰 차이가 난다.

조금전에 가정했듯이 Row 10만 건이 있다가 했을 때 전체 값이 NULL인 경우에 앞선 예는 10만 번이나 '0'을 더하는 연산을 하여 '0'을 출력하지만 바로 위의 예는 한번도 연산을 하지 않고 '0'을 출력하게 된다.

 

 

 

이번에는 두 컬럼의 연산이 있는 경우를 살펴보도록 하겠다.

예를 들어 아래와 같이 데이터가 들어 있다고 했을 경우 어떤 결과가 나오는지 확인해 보자.

ROW

COL1

COL2

1

NULL

NULL

2

1

NULL

3

1

1

 

 

* 실행과 결과

SELECT SUM(COL1), SUM(COL1+NULL), SUM(COL1+COL2) FROM 테이블명

---------------------------------------------------------------------------

2 NULL 2

 

위 결과를 보면 SUM(COL1)은 맨 처음 설명했던 대로 결과가 나와 문제가 없다.

그런데 SUM(COL1+COL2)은 "3"이 나올 줄 알았는데 "2"만 나왔다.

SUM 함수가 제공해주는 편의는 어떻게 보면 제공 해 주다가 만 듯한 결과를 보인다.

이 함수가 동일한 컬럼 내의 NULL연산은 처리해 주지만 컬럼별 연산은 처리를 못한다. 다시 말해, 1ROW와 2ROW에는 각 컬럼에 NULL을 포함하고 있기 때문에 NULL처리되고, 실질적으로 3ROW만 정상적으로 처리하게 된다.

따라서, SUM안에서 컬럼별 연산을 할 때에는 NULL을 유발할 수 있는 것들을 반드시 제거해야 한다.

 

이런 경우는 아래와 같이 처리하면 되겠다.

 

NVL(SUM(COL1),0)+ NVL(SUM(COL2),0)

 

[오라클] SQL - SUM()함수에서 NULL값의 처리
출처 : 네이버 블로그

 

 

select * from s_sale_promotion a, s_sale_promotion_emp b
where a.row_id = b.promotion_id
and   a.type = '140'
and   a.sub_type = '010'

'SQL 관련' 카테고리의 다른 글

날짜 관련 SQL  (0) 2016.07.14
부서별 건수  (0) 2015.03.10
집계테이블은 서브 쿼리를 사용하지 않아도 된다.  (0) 2015.02.28
계층형 쿼리 ( START WITH ... CONNECT BY )  (0) 2014.09.29
유용한 쿼리 #1  (0) 2014.09.29
Posted by 달콤한부자
,

계층형 쿼리(Hierarchical Query)는 오라클에서만 지원하고 있는 아주 막강한 기능 중의 하나다.

 

관계형(relational)이라는 의미가 서로 평등하고 수평적인 관계를 의미하는 반면 계층형(hirearchical) 구조는 이와는 다르게 평등한 관계가 아닌 계급적이고 수직적인 관계를 가진다. 한마디로 말해서 관게형이 평면적이라 한다면 계층형은 수직적 구조라 할수있다.

 

계층형 정보에는 사회적인 의미의 계급구조, 등이 있고

소프트웨어 관점에서 살펴보면, 웹사이트에서 사용하는 답변형 게시판이나 BOM(Bill Of Material)등이 계층형 정보의 전형적인 예이다.

 

* BOM(Bill Of Material) 이란? 하나의 완제품이 만들어지는데 필요한 구성품목들의 내역 혹은 조합도를 말함.

 

컴퓨터 구성도(BOM)

계층적 구조에서 사용되는 용어 정리

노드(node) : 위 그림에서 원모양으로 표시된 항목을 노드라고 한다. 각각의 품목이 하나의 노드가 되며 실제 테이블에서는 하나의 로우에 대응

부모(parent) : 부모노드라고도 한다. 즉 트리구조에서 상위에 있는 노드를 말한다.

자식(child) : 자식노드라고도 한다. 위 그림에서 '모니터'는 컴퓨터의 자식노드이며, 컴퓨터는 모니터와 본체의 부모노드가 된다.

리프(leaf) : 리프노드라고도 한다. 더이상 하위에 연결된 노드가 없는 항목을 말한다. 즉 자식노드가 없는 노드라고 할수있으며 모니터, 프린터, 랜카드가 이에 해당된다.

루트(root) : 계층형, 트리구조에서 최상위에 있는 노드를 말한다. 컴퓨터가 이에 해당

레벨(level) : 트리구조에서의 각각의 계층을 말한다. 루트에 해당되는 '컴퓨터'가 1레벨이 되며, 순차적으로 그 하위에 있는 '모니터', '본체' 등이 2레벨이 된다.

 

 

계층형 쿼리의 작성


[DDL]


CREATE TABLE BOM (
ITEM_ID INTEGER NOT NULL, -- 품목식별자
PARENT_ID INTEGER, -- 상위품목 식별자
ITEM_NAME VARCHAR2(20) NOT NULL, -- 품목이름
ITEM_QTY INTEGER, -- 품목 개수
PRIMARY KEY (ITEM_ID)
);

INSERT INTO BOM VALUES ( 1001, NULL, '컴퓨터', 1);
INSERT INTO BOM VALUES ( 1002, 1001, '본체', 1);
INSERT INTO BOM VALUES ( 1003, 1001, '모니터', 1);
INSERT INTO BOM VALUES ( 1004, 1001, '프린터', 1);

INSERT INTO BOM VALUES ( 1005, 1002, '메인보드', 1);
INSERT INTO BOM VALUES ( 1006, 1002, '랜카드', 1);
INSERT INTO BOM VALUES ( 1007, 1002, '파워서플라이', 1);
INSERT INTO BOM VALUES ( 1008, 1005, 'CPU', 1);
INSERT INTO BOM VALUES ( 1009, 1005, 'RAM', 1);
INSERT INTO BOM VALUES ( 1010, 1005, '그래픽카드', 1);
INSERT INTO BOM VALUES ( 1011, 1005, '기타장치', 1);

select * from bom 질의어 실행결과 :

1) 일반 조인을 사용한 계층형 쿼리


테이블 개수가 하나이며 각각의 품목 정보들은 서로 부모와 자식 관계로 연결되어 있으므로 조인을 사용해야하는데, 자기 참조 성격이 있으므로 셀프조인을 사용.

루트노드에 해당하는 컴퓨터의 경우 가장 상위의 1레벨에 속하기 때문에 PARENT_ID컬럼값이 NULL이다. 그래서 최종 제품인 컴퓨터를 위해 외부 조인도 사용

 

SELECT bom1.item_name,

bom1.item_id,

bom2.item_name parent_item

FROM bom bom1, bom bom2

WHERE bom1.parent_id = bom2.item_id(+)

ORDER BY bom1.item_id;

 

=> 동일한 테이블인 BOM을 각각 bom1, bom2라는 별칭(alias)을 주어 셀프조인을 사용하였고, WHERE절을 보면 알수있듯이 bom1이 하위 품목을 , bom2가 상위품목을 나타냄을 알수있다. 가장 상위 품목인 컴퓨터의 경우, 자신이 최상위 계층이고 PARENT_ID컬럼에 NULL이 들어가므로 외부조인을 사용하였다.

 

=> 계층적인 순서로 결과가 나오긴했지만 계층형구조(트리구조)와는 조금 다른 결과이다.

예를 들어 본체의 하위 품목인 메인보드, 랜카드, 파워서플라이 품목이 프린터 바로 밑에 조회되어 마치 프린터의 하위품목인것처럼 보여진다.

 

=> 이문제를 해결하기위해 오라클에서 지원하는 계층형 쿼리를 살펴보자.

 

 

2) START WITH ... CONNECT BY 절을 사용한 계층형 쿼리

START WITH ... CONNECT BY 절은 계층형 정보를 표현하기 위한 목적으로 오라클 8i부터 지원되기 시작.

SELECT item_name, item_id, parent_id

FROM bom

START WITH parent_id IS NULL --루트노드를 지정,

CONNECT BY PRIOR item_id = parent_id;--부모와 자식노드들간의 관계를 연결

 좀더 보기좋게 레벨별로 들여쓰기를 한후 결과를 다시 확인해보자.


SELECT LPAD(' ', 2*(LEVEL-1)) || item_name item_names,

item_id,

parent_id

FROM bom

START WITH parent_id IS NULL

CONNECT BY PRIOR item_id = parent_id;

 

* PRIOR 키워드...

본체의 PARENT_ID는 부모노드인 컴퓨터의 ITEM_ID와 연결되므로 PRIOR키워드는 PARENT가 아닌 ITEM_ID앞에 붙어야한다.

 


3) START WITH 조건1 ... CONNECT BY 조건2

[[START WITH 조건1] [CONNECT BY 조건2]

* START WITH 조건1 : 루트노드를 식별한다. 조건1을 만족하는 모든 ROW 들은 루트노드가 된다.

START WITH절을 생략할수도 있는데 이러한 경우 모든 ROW들을 루트노드로 간주한다. 조건1에는 서브쿼리도 올수있다.

 

* CONNECT BY 조건2 : 부모와 자식노드들 간의 관계를 명시하는 부분이다.

조건2에는 반드시 PRIOR연산자를 포함시켜야하며, 이는 부모노드의 컬럼을 식별하는데 사용된다.

START WITH과는 달리 조건2에서는 서브쿼리가 올수 없다.

 

* PRIOR연산자

 

PRIOR키워드는 워직 계층형 쿼리에서만 사용하는 오라클 SQL연산자이다. 키워드라고 표현했지만 실제로는 CONNECT BY절에서 등호(=)와 동등한 레벨로 사용되는 연산자이며 CONNCET BY절에서 해당 컬럼의 부모로우를 식별하는데 사용된다.

앞의 예에서 본체의 PARENT_ID 컬럼에는 컴퓨터의 ITEM_ID값을 가지고 있으므로 PRIOR연산자는 ITEM_ID앞에 붙게 된다.

 

* 레벨 의사컬럼(LEVEL Pseudocolumn)

 

계층형 정보를 표현할 때 레벨을 나타낸다.

LEVEL도 일반적인 컬럼 처럼 SELECT, WHERE, ORDER BY 절에서 사용할수있다.


 [문제] 정리 퀴즈


샘플 테이블 (BOM)에서 본체를 포함해서 본체의 하위 품목들만 계층구조로 조회하시오

 

 

 

계층형 쿼리의 확장

=> 오라클에서는 계층형 쿼리에서 추가적인 정보를 제공하기 위해 몇가지 키워드를 더 제공하고 있다.

 

CONNECT_BY_ROOT (루트노드 찾기)

CONNECT_BY_ROOT 컬럼

* ​단독으로 사용되지 못하고 일반컬럼과 같이 사용해야함.

CONNECT_BY_ISCYCLE (중복 참조값 찾기)

CONNECT_BY_ISCYCLE은 반드시 CONNECT BY절에 NOCYCLE이 명시되어 있어야 사용이 가능하다.

CONNECT_BY_ISLEAF (리프노드 찾기)

계층형 쿼리에서 해당 로우가 리프노드인지(지삭노드가 없는 노드인지) 여부를 체크하여, 리프노드에 해당할경우 1을 그렇지 않을 경우 0을 반환

SYS_CONNECT_BY_PATH (루트 찾아가기)

SYS_CONNECT_BY_PATH ( column, char )

'SQL 관련' 카테고리의 다른 글

날짜 관련 SQL  (0) 2016.07.14
부서별 건수  (0) 2015.03.10
집계테이블은 서브 쿼리를 사용하지 않아도 된다.  (0) 2015.02.28
SUM()함수에서 NULL값의 처리  (0) 2014.12.11
유용한 쿼리 #1  (0) 2014.09.29
Posted by 달콤한부자
,

유용한 쿼리 #1

SQL 관련 2014. 9. 29. 11:09

1. 컬럼 추가 및 컬럼코멘트 달기 굿모닝3


ALTER TABLE HQLTTM966 ADD(Q966_MAT_PATTERN VARCHAR2(5));


COMMENT ON COLUMN HQLTTM966.Q966_MAT_PATTERN IS '품목Pattern';


2.  테이블 COPY ( 테이블 생성 및 데이터 복사)


CREATE TABLE HQLTTM951_RIM951 AS

SELECT * FROM HQLTTM951



3. 데이타 있는 테이블 컬럼 변경하기


 

create table hqlttm966_temp as select * from hqlttm966;


delete from hqlttm966;

     

alter table hqlttm966 modify (q966_pickup_date date);

alter table hqlttm966 modify (q966_test_date date);

alter table hqlttm966 modify (q966_write_date date);

alter table hqlttm966 modify (q966_draft_date date);

alter table hqlttm966 modify (q966_review_date date);

alter table hqlttm966 modify (q966_confirm_date date);

alter table hqlttm966 modify (q966_trans_date date);


insert into hqlttm966

select * from hqlttm966_temp;


4. TEXT 혹은 주석명으로 SOURCE 찾기

SELECT *
  FROM ALL_SOURCE
 WHERE NAME NOT LIKE 'BIN%'
   AND TEXT LIKE '%966%'
Posted by 달콤한부자
,