뷰(View) 에서의 ORDER BY > db

본문 바로가기

db

뷰(View) 에서의 ORDER BY

페이지 정보

작성자 서방님 댓글 0건 조회 24회 작성일 06-12-13 21:04

본문

뷰에서는 일반적으로 ORDER BY를 사용할 수 없습니다. 하지만 TOP n 이 포함된 경우는 ORDER BY를 사용 할 수 있습니다.

만일 누군가가 다음과 같은 요구를 했다고 가정하겠습니다.

"Pubs 데이터베이스의 titles 테이블을 대상으로 title_id와 title 컬럼만을 보여주는 뷰(View)를 만들어 주세요! 단, title_id 컬럼을 기준으로 내림차순으로 정렬된 뷰여야 합니다."

대부분 위 요구사항을 받게 되면 다음과 같은 방법으로 뷰를 만들려고 할 것입니다.

 

USE Pubs
GO

CREATE VIEW vw_titles
AS
SELECT title_id, title FROM titles
ORDER BY title_id ASC

하지만 위 쿼리문이 수행이되면 원하는 뷰가 만들어지는것이 아니고 다음과 같은 에러가 발생합니다.

 

서버: 메시지 1033, 수준 15, 상태 1, 프로시저 vw_titles, 줄 4
TOP을 함께 지정하지 않는 한 뷰, 인라인 함수, 파생 테이블, 하위 쿼리에서 ORDER BY 절을 사용할 수 없습니다.

위와 같은 에러가 발생하는 이유는 뷰에서 TOP n 을 사용하지 않는 한 ORDER BY를 뷰 안에 포함 시킬 수 없기 때문입니다. 결국 위 요구사항을 만족시키는 뷰를 만들지 못하고 어쩔 수 없이 다음과 같이 정렬되지 않은 뷰를 만들게 됩니다.

 

USE Pubs
GO

CREATE VIEW vw_titles
AS
SELECT title_id, title FROM titles

그리고 이 뷰를 대상으로 검색을 할 때 ORDER BY를 사용해서 정렬을 하도록 지시합니다. 즉 다음과 같이 만들어진 뷰를 사용하게 됩니다.

 

SELECT * FROM vw_titles ORDER BY title_id DESC

요구한 사람은 자신이 요구한 대로 뷰가 만들어지지 않았기 때문에 불평을 하면서 뷰를 사용하게 될 것입니다. 그렇다면 과연 처음에 요구된 대로 뷰를(내림차순으로 정렬된 뷰를) 만들 수 없을까요?

방법이 있습니다. 위 에러 메세지가 알려주는 대로 TOP n 문을 사용하는 것입니다. 여기서 의문이 생기는 것은 뷰가 전체 행을 포함해야 하는데 "전체" 를 어떻게 TOP n 으로 지정할 수 있는가 하는 것입니다. 만일 요구 사항에 상위 10 개만 내림차순으로 정렬된 결과를 원한다고 되어 있다면 다음과 같이 하면 요구사항을 완벽하게 소화해 내게 됩니다.

 

USE Pubs
GO

CREATE VIEW vw_titles
AS
SELECT TOP 10 title_id, title FROM titles
ORDER BY title_id DESC

그런데 문제는 10개도, 100개도 1,000개도 아닌 "전체" 행입니다. TOP ALL 이 있으면 좋겠지만 TOP ALL이라고 하는 것은 없습니다. 하지만...

TOP 100 PERCENT가 있습니다!

 

USE Pubs
GO

CREATE VIEW vw_titles
AS
SELECT TOP 100 PERCENT title_id, title FROM titles
ORDER BY title_id DESC

TOP n PERCENT는 상위 n%에 포함되는 결과를 얻게 해줍니다. TOP 100 PERCENT, 결국 100%에 포함되는 행을 검색하게 되기 때문에 전체 행이 대상이 됩니다.

3) 정리

많은 분들이 TOP n 은 잘 아시는데 TOP n PERCENT에 대해서는 모르고 있습니다. 상위 n % 만을 포함시키는 TOP n PERCENT를 이용해서 뷰 안에서 전체 행을 정렬 할 수 있는 방법을 알아 보았습니다. 이처럼 조금만 더 생각한다면 편하게 쿼리문을 작성 할 수 있습니다.

댓글목록

등록된 댓글이 없습니다.

Total 447건 1 페이지
게시물 검색

회원로그인

접속자집계

오늘
178
어제
365
최대
592
전체
40,152

그누보드5
Copyright © seobangnim.com All rights reserved.
자바스크립트를 활성화 하세요![ 브라우저에서 자바스크립트를 활성화하는 방법 ]