Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  Logical Query Processing 02 
작성일시 : 2009. 3. 18. 13:24 | 분류 : SQL Server/Kernel

본 글을 읽기 위해서는 이전 Logical Query Processing 01 를 먼저 확인 하고 읽어야 한다.
본 문서는 INSIDE SQL SERVER 2005의 내용을 기반으로 작성 되었다.

Logical Query Processing 01 : http://maystyle.tistory.com/420

Step 6 CUBE 및 ROLLUP 옵션 적용
만약 CUBE 나 Rollup 조건이 기술 되어 있는 경우 Supergroup을 만들고 해당 그룹을 VT6에 추가한다..

Step 7 Having 필터 적용
Having 필터는 이전 스탭에서 생성된 테이블에 적용된다. 오직 <having_condition>이 참인 그룹만 Step7의 가상 테이블 VT7 이 된다
HAVING COUNT(O.orderid) < 3 조건에 의해 이전에 VT 5의 KRLOS 는 제거 된다.

VT7
FISSA    Madrid    NULL    NULL
FRNDO    Madrid    1    FRNDO
            Madrid    2    FRNDO

* Aggregate Function 은 Subquery 를 허용하지 않는다. (예 HAVING SUM((SELECT …)) > 10 

Step 8 Select List 처리
SELECT 단계는 최초로 호출자의 요청에 맞는 table을 생성하는 단계입니다. Step 5에서 명시한 것과 같이 Group By에 선언이 되었다면 SELECT 절에서는 반드시 Aggregate Function을 사용하고 있어야 합니다. (예 SELECT customerID, SUM(price) … Group by customerID)
select c.customerid, COUNT(o.orderid) as numorders 쿼리를 적용하면 VT8이 생성 된다.

VT8

FISSA    0
FRNDO    2

Step 9 DISTINCT 조건 적용
DISTINCT 조건이 명시되어 있으면 이전에 생성된 VT8 의 중복된 ROW들을 삭제한다. 사실 GROUP BY 가 사용될 때는 DISTINCT는 별 의미가 없다. (실제로 ROW 삭제를 않한다.)

Step 10 ORDER BY 조건 적용
이전의 VT9의 테이블을 정렬한 커서 VC10을 리턴 한다.  해당 결과는 TABLE이 이 아니다. 다음 결과를 보자

SELECT * FROM (SELECT orderid FROM orders ORDER BY orderid) AS D;
위의 쿼리는 에러를 일으킨다. SQL 구문에서 ORDER BY 구문을 table expression 으로 사용할 수 없다.

VC 10
FISSA    0
FRNDO    2

Step 11 Top 옵션 적용
우리가 TOP 조건을 주면 해당 해당 조건에 따라 (물리적으로 테이블에 데이터가 나열된 순서에 맞춰) TOP 조건을 적용한 VT 11을 리턴 한다.

TOP 과 ORDER BY를 사용하게 되면 table expression 이 가능해집니다. 어차피 TOP의 반환 값이 Table이기 때문이죠. 이를 태면 위의 SELECT * FROM (SELECT orderid FROM orders ORDER BY orderid) AS D;  는 SELECT * FROM (SELECT TOP 100 PERSENT orderid FROM orders ORDER BY orderid) AS D; 변경하면 실행이 가능합니다.

그와 더불어 TOP에는 WTIH TIES 옵션을 같이 써야 하는 경우가 있다. 이를 태면 상위 10%의 학생들의 이름을 확인 하라 라는 쿼리가 있다고 가자.
이 경우 SELECT TOP 10 PERSENT name FROM students ORDER BY score 로 표현할 수 있다. 다만 이때 10%에 걸리는 학생들이 여러 명일 경우에는 실제로 10%가 넘어갈 수도 있고, 해당 학생들은 본 쿼리에서 확인이 안될 것이다. 이 경우 모든 학생들의 리스트를 확인 하기 위하여 WITH TIES 옵션을 사용해야 한다.

|