본문 바로가기

오라클

inline view (또는 subquery), WITH

-- inline view (또는 subquery)
  -- inline view 는 SELECT, INSERT, UPDATE, DELETE 문이나 다른 하위 쿼리 내부에 출력된 SELECT 문
  -- inline view 식이 허용 되는 모든 위치에서 사용할 수 있으며 단독으로 실행 가능하다.

 

-- 판매된 책코드, 책이름
SELECT b_id, title
  FROM book
  WHERE b_id IN (SELECT b_id FROM panmai);
 
-- WHERE절에서 잘못 사용된 예


SELECT 컬럼1,컬럼2 FROM 테이블1
  WHERE 컬럼1=(SELECT 컬럼1, 컬럼2 FROM 테이블2);
    -- WHERE 절에 사용한 경우 괄호안의 SELECT문의 컬럼은 하나만 가능
 
SELECT 컬럼1,컬럼2 FROM 테이블1
  WHERE 컬럼1 IN(SELECT 컬럼1, 컬럼2 FROM 테이블2);
    -- WHERE 절에 사용한 경우 괄호안의 SELECT문의 컬럼은 하나만 가능

 

SELECT b_id, title FROM book
  WHERE b_id = (SELECT b_id FROM panmai);
    -- 서브쿼리는 데이터가 여러가지이다. 이것을 b_id 하나의 데이터와 비교할 수 없으므로 에러
    -- 만약 서브쿼리에 데이터가 하나만 있다면 비교할 수 있다.




--WITH : inline 뷰를 미리 블럭으로 정한후 사용(여러번 사용될 경우 간결)

-- 서점별 총판매금액

SELECT to_CHAR(p_date, 'YYYY') 년도,g.g_id, g_name, SUM(price*p_su) amt

  FROM gogaek g

  JOIN panmai p ON g.g_id= p.g_id

  JOIN danga d ON p.b_id = d.b_id

  GROUP BY to_char(p_date, 'YYYY'),g.g_id,g_name

  ORDER BY 년도;

 

 --년도별 총판매금액 가장많은 서점

WITH year_pan AS( -- 서점별,년도별 총판매금액 쿼리

SELECT to_CHAR(p_date, 'YYYY') 년도,g.g_id, g_name, SUM(price*p_su) amt

  FROM gogaek g

  JOIN panmai p ON g.g_id= p.g_id

  JOIN danga d ON p.b_id = d.b_id

  GROUP BY to_char(p_date, 'YYYY'),g.g_id,g_name

  ORDER BY 년도

)

SELECT 년도, g_id,g_name, amt FROM( -- 위 쿼리중 년도별 가장 높은 총판금액 서점.

  SELECT 년도, g_id, g_name, amt, RANK() OVER(PARTITION BY 년도 ORDER BY amt DESC) 순위

  FROM year_pan

) WHERE 순위=1;



'오라클' 카테고리의 다른 글

PL/SQL  (0) 2013.06.04
트랜잭션  (0) 2013.06.04
데이터 삭제  (0) 2013.06.01
데이터 수정하기  (0) 2013.06.01
오라클의 자료형  (0) 2013.05.30