뷰(View) 에서의 ORDER BY
페이지 정보
작성자 서방님 댓글 0건 조회 133회 작성일 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 |
하지만 위 쿼리문이 수행이되면 원하는 뷰가 만들어지는것이 아니고 다음과 같은 에러가 발생합니다.
|
서버: 메시지 1033, 수준 15, 상태 1, 프로시저 vw_titles, 줄 4 TOP을 함께 지정하지 않는 한 뷰, 인라인 함수, 파생 테이블, 하위 쿼리에서 ORDER BY 절을 사용할 수 없습니다. |
위와 같은 에러가 발생하는 이유는 뷰에서 TOP n 을 사용하지 않는 한 ORDER BY를 뷰 안에 포함 시킬 수 없기 때문입니다. 결국 위 요구사항을 만족시키는 뷰를 만들지 못하고 어쩔 수 없이 다음과 같이 정렬되지 않은 뷰를 만들게 됩니다.
|
USE Pubs GO CREATE VIEW vw_titles |
그리고 이 뷰를 대상으로 검색을 할 때 ORDER BY를 사용해서 정렬을 하도록 지시합니다. 즉 다음과 같이 만들어진 뷰를 사용하게 됩니다.
|
SELECT * FROM vw_titles ORDER BY title_id DESC |
요구한 사람은 자신이 요구한 대로 뷰가 만들어지지 않았기 때문에 불평을 하면서 뷰를 사용하게 될 것입니다. 그렇다면 과연 처음에 요구된 대로 뷰를(내림차순으로 정렬된 뷰를) 만들 수 없을까요?
방법이 있습니다. 위 에러 메세지가 알려주는 대로 TOP n 문을 사용하는 것입니다. 여기서 의문이 생기는 것은 뷰가 전체 행을 포함해야 하는데 "전체" 를 어떻게 TOP n 으로 지정할 수 있는가 하는 것입니다. 만일 요구 사항에 상위 10 개만 내림차순으로 정렬된 결과를 원한다고 되어 있다면 다음과 같이 하면 요구사항을 완벽하게 소화해 내게 됩니다.
|
USE Pubs GO CREATE VIEW vw_titles |
그런데 문제는 10개도, 100개도 1,000개도 아닌 "전체" 행입니다. TOP ALL 이 있으면 좋겠지만 TOP ALL이라고 하는 것은 없습니다. 하지만...
TOP 100 PERCENT가 있습니다!
|
USE Pubs GO CREATE VIEW vw_titles |
TOP n PERCENT는 상위 n%에 포함되는 결과를 얻게 해줍니다. TOP 100 PERCENT, 결국 100%에 포함되는 행을 검색하게 되기 때문에 전체 행이 대상이 됩니다.
3) 정리
많은 분들이 TOP n 은 잘 아시는데 TOP n PERCENT에 대해서는 모르고 있습니다. 상위 n % 만을 포함시키는 TOP n PERCENT를 이용해서 뷰 안에서 전체 행을 정렬 할 수 있는 방법을 알아 보았습니다. 이처럼 조금만 더 생각한다면 편하게 쿼리문을 작성 할 수 있습니다.
댓글목록
등록된 댓글이 없습니다.