TOP, OFFSET 또는 FOR XML을 함께 지정하지 않으면 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 ORDER BY 절을 사용할 수 없습니다.

 프로시저 내에서 union 되는 쿼리를 임시테이블(with)로 작성하여 처리하던 중에 위와 같은 에러가 발생했습니다.

문제가 발생한 쿼리 구조는 아래와 같습니다.

;WITH '임시테이블' AS (
SELECT 
    --top 100 percent
    A.aaa
    A.bbb
    A.ccc
FROM	
	AAA AS A
WHERE	...			   

UNION ALL

SELECT
    --top 100 percent
    B.aaa
    B.bbb
    B.ccc
FROM	
	BBB AS B
WHERE	...

ORDER BY B.aaa DESC, B.ccc DESC
)
select * from '임시테이블'

 Union 한 두 select 쿼리 하단에 order by 구문으로 인해 발생한 에러입니다.

쿼리에 select 다음에 주석처리 되있는 'top 100 percent'를 작성해주면 위 에러는 해결이 됩니다.

 

 * 참고로 top N percent 퀴리는 예를 들어 select 쿼리 결과 row수가 400개 일 때 top 20 percent 쿼리를 작성해주면 400개의 20%인 80개의 결과. top 20으로 작성하면 20개의 결과만 출력됩니다

키워드 'with' 근처의 구문이 잘못되었습니다. 이 문이 공통 테이블 식이거나, xmlnamespaces 절이거나, 변경 내용 추적 컨텍스트 절인 경우에는 이전 문을 세미콜론으로 종료해야 합니다.

  MSSQL에서 임시테이블(with)쿼리를 작성하다보면 위와 같은 에러가 종종 발생합니다.

해결은 허무할 만큼 에러 메시지에 간단하게 나와있습니다

'With'앞에 세미콜론(;)만 붙여주면 됩니다.

-- WITH 앞에 세미콜론을 붙여주세요 --
;WITH '임시테이블명' AS (
			SELECT *
			  FROM	A   
			
			UNION ALL
			
			SELECT *			 
			  FROM	B
			 )
     select * from '임시테이블명'
SELECT TOP 100, 컬럼1, 컬럼2, * FROM 테이블이름;
SELECT TOP 1000 * FROM 테이블이름;

 mysql에선 'limit n'으로 쿼리를 작성하지만 mssql은 select 바로 다음에 'TOP N(숫자)'으로 쿼리를 작성해주면 상위 N개의 결과값이 검색된다.

 생각나서 찾아보니 하위 N개에 대한 쿼리는 없는 듯... order by desc/asc로 처리해주면 된다.

+ Recent posts