본문 바로가기

CTE

Way to access the next row value 특정 record에 연속된 (다음 id, 하지만 연속적이지는 않을 수 있는) record를 가져오는 방법입니다. 이를 구현하기 위해서 CTE(Common table expression)을 이용하였습니다. ROW_NUMBER()를 이용하여 연속된 번호를 부여한 뒤에 Join하는 형태의 전략으로 접근하였습니다. WITH CTE AS ( SELECT ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNo , * FROM Log WITH (NOLOCK) WHERE dailyID = 191 AND type = 1 ) SELECT CUR.id , CUR.dailyID , CUR.type , '|' AS'|' , NXT.id , NXT.dailyID , NXT.type FROM CTE AS.. 더보기
CTE 무한루프 이전에 유용하게 사용했던 CTE SQL에서 간혹 오류가 나는 경우가 발생했습니다.'문의 완료되기 전에 최대 재귀 횟수(?)가 초과되었습니다.' 이는 서버에서 CTE로 인한 무한루프를 방지하기 위한 장치의 제한이 걸렸기 때문일 가능성이 있습니다.기본적으로 최대 100회의 재귀 CTE가 허용되며, 이는 0~32,767의 범위를 가질 수 있습니다.질의의 마지막에 다음 구문을 추가하는 것으로 재귀 회수를 제어할 수 있습니다. SQL OPTION (MAXRECURSION 100) Referenceshttps://technet.microsoft.com/ko-kr/library/ms175972(v=sql.105).aspxhttps://technet.microsoft.com/ko-kr/library/ms181714(v.. 더보기
CTE 일반적으로 Group은 재귀적으로 참조하는 형태입니다.(Group.ParentGroupId = Group.Id 형태) 이에 데이터 조회시 반복처리를 해야 하는 형태가 발생함으로 이를 쉽게 처리할 수 있는 방법은 없을까요?해답은 MSSQL 2005 이후 버전에서 지원하는 CTE(Common Table Expression) 입니다. Anchor set을 설정하고, 이를 재귀적으로 순환하며 참조하게 하는 SQL를 작성할 수 있습니다. Example WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS ( -- Anchor SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel FROM dbo.MyEm.. 더보기