본문 바로가기
Programming/DataBase

[mssql] TOP()

by 막이 2012. 10. 8.
TOP()
: 결과 집합의 윗부분을 정렬 순서대로 끊어 와서 반환하기 때문에
실행 속도가 매우 빠르며 실행에 오버헤드가 거의 없습니다.
인덱스만 잘 걸어주면 TOP() 은
수억 개의 레코드가 있는 테이블에서도 상위 몇 개의 레코드를 반환하는 처리를 순식간에 해주기 때문에
대용량 데이터베이스에서 처리를 할 때 유용하게 사용됩니다.


1. 쿼리 결과에서 지정한 만큼의 최상단 행 집합만을 반환하는 용도로 사용한다.

SELECT TOP(1) RISK_LIST_CODE, RISK_CONT, IDX

FROM BLG_PJT_R_RISK WITH (NOLOCK) ORDER BY IDX DESC;

RISK_LIST_CODE RISK_CONT IDX
1 RC-P-계약-1 마바사 리스크내용 652



2. () 들어갈 인수로 행의 개수 또는 백분율로 지정할 수 있다.
MSSQL 2005 부터는 변수나 쿼리도 가능하다.

SELECT TOP(0.5)PERCENT RISK_LIST_CODE, RISK_CONT, IDX

FROM BLG_PJT_R_RISK WITH (NOLOCK) ORDER BY IDX DESC;

RISK_LIST_CODE RISK_CONT IDX
1 RC-P-계약-1 마바사 리스크내용 652
2 CW-D-4-5 장기간 보양 Film 외기... 651


DECLARE @N INT;

SET @N=3;

SELECT TOP(@N) RISK_LIST_CODE, RISK_CONT, IDX

FROM BLG_PJT_R_RISK WITH (NOLOCK) ORDER BY IDX DESC;

RISK_LIST_CODE RISK_CONT IDX
1 RC-P-계약-1 마바사 리스크내용 652
2 CW-D-4-5 장기간 보양 Film 외기... 651
3 CW-D-4-4 불량 보양재 적용 650
주의: TOP에 변수를 사용하는 경우에는 반드시 TOP(@N) 로 사용해야 한다.
TOP @N --> 불가


SELECT COUNT(*) FROM BLG_PJT_R_RISK WITH (NOLOCK) --결과값: 1
WHERE RISK_LIST_CODE_COM IS NOT NULL;

SELECT TOP(

SELECT COUNT(*) FROM BLG_PJT_R_RISK

WHERE RISK_LIST_CODE_COM IS NOT NULL

) RISK_LIST_CODE, RISK_CONT, IDX

FROM BLG_PJT_R_RISK WITH (NOLOCK) ORDER BY IDX DESC;

RISK_LIST_CODE RISK_CONT IDX
1 RC-P-계약-1 마바사 리스크내용 652



3. SELECT, INSERT, UPDATE, DELETE 에서 사용할 수 있고,
INSERT, UPDATE, DELETE 에서는 영향받는 행의 범위를 지정하는데 사용한다.

UPDATE TOP(1) BLG_PJT_R_RISK SET RISK_LIST_CODE_COM = 7777777 WHERE IDX >= 561;


------------------------------------------------------------------------------------------------------
주의: INSERT, UPDATE, DELETE 에 사용된 TOP 는 어떠한 순서로도 정렬이 되지 않습니다.
TOP(N) 은 임의의 N개의 행을 반환합니다.

예를 들어 다음 INSERT 문에 ORDER BY 절이 있지만 이 절은 INSERT 문에서 직접 참조하는 행에는 적용되지 않습니다.

INSERT
TOP(2) INTO TABLE2(ColumnB)

SELECT ColumnA FROM TABLE1

ORDER BY ColumnA;


위 쿼리의 ORDER BY 절은 중첩 SELECT 문에서 반환되는 행만 참조합니다.
INSERT 문은 SELECT문에서 반환되는 행 중 두 개를 선택합니다.
SELECT 서브쿼리에서 맨 위의 두 행을 삽입하려면 다음과 같이 쿼리를 작성합니다.

INSERT
INTO TABLE2(ColumnB)

SELECT TOP(2)ColumnA FROM TABLE1

ORDER BY ColumnA;


-출처:Microsoft TechNet (http://technet.microsoft.com/ko-kr/library/ms189463.aspx)
-----------------------------------------------------------------------------------------------------
정리하면 INSERT, UPDATE, DELETE 문에서는 TOP() 을 사용할 때 정렬이 안되기 때문에
전자는 임의의 행에 대해 작업을 하게 됩니다.
특정 정렬순서를 갖는 조건에서 수행하려면 후자처럼 서브쿼리를 통해서 이 기능을 구현해야 합니다.
그러므로 임의의 행에 작업을 해도 되는 경우가 아니라면
INSERT, UPDATE, DELETE 문에 직접 TOP() 을 사용하지 않는 것이 좋습니다.


4. 오라클에서 TOP() 과 같은 기능 사용하기 (ROWNUM 이용)
MSSQL : SELECT TOP(1) RISK_LIST_CODE, RISK_CONT, IDX
FROM BLG_PJT_R_RISK;

ORACLE: SELECT RISK_LIST_CODE, RISK_CONT, IDX
FROM BLG_PJT_R_RISK
WHERE ROWNUM < 2;


정렬 후 사용하기
MSSQL : SELECT TOP(1) RISK_LIST_CODE, RISK_CONT, IDX

FROM BLG_PJT_R_RISK ORDER BY IDX DESC;


ORACLE: SELECT RISK_LIST_CODE, RISK_CONT, IDX

FROM (SELECT * FROM BLG_PJT_R_RISK ORDER BY IDX DESC)

WHERE ROWNUM < 2;
(파싱순서가 ORDER BY 절이 WHERE 절보다 늦기 때문에 FROM 절에 정렬된 테이블을 갖고 있어야 한다.)

 

'Programming > DataBase' 카테고리의 다른 글

[Mssql] CONVERT  (0) 2012.10.12
[Mssql]Row_Number() OVER  (0) 2012.10.11
[Mssql] union과 union all의 사용법  (0) 2012.10.08
[ORACLE] 이전글, 다음글 쿼리  (0) 2012.09.27
ORA-01747: 열명을 올바르게 지정해 주십시오  (0) 2012.09.26