BEGIN TRY -- TRY문(일반 실행) BEGIN TRAN -- MS SQL은 기본 설정이 AUTO COMMIT이라 INSERT, UPDATE, DELECT 등 명령어를 사용할 때 COMMIT 명령어를 입력할 필요가 없다. -- 그래서 쿼리 실행 도중 실수하게되면 큰일 발생 => 이를 방지하기 위한 것. DECLARE @TBL_TEMP TABLE( -- 임시 테이블 선언 BD_Num INT ,BD_Group INT ,BD_Order INT ,BD_Depth INT ,BD_Title NVARCHAR(50) ,BD_Step VARCHAR(255) ) -- 조회할 내용 -- 그룹번호로 묶어서 그 중 게시물 번호 최대값을 추출 SELECT MAX(BD_Num) AS MAX_BD_Num , BD_Group FROM tBD2 GROUP BY BD_Group ORDER BY 1 DESC DECLARE @i int, @j int, @z int -- 변수 선언 SELECT @i = 1, @j = @@rowcount -- @@rowcount : 최근 실행된 문의 영향을 받은 행 수 WHILE @i <= @j BEGIN -- i번째 그룹번호(BD_Group) z변수에 넣기 SELECT @z = A.BD_Group FROM ( SELECT MAX(BD_Num) AS MAX_bd_num , BD_Group , ROW_NUMBER() OVER(ORDER BY MAX(BD_Num) DESC) AS rnum FROM tBD2 GROUP BY BD_Group ) A WHERE A.rnum = @i; -- 그룹번호(BD_Group)가 z변수와 같은 레코드 가져오기 (같은 그룹번호를 가진 레코드 가져오기) -- 이때, 들여쓰기(BD_Depth)가 같고 그룹내순서(BD_Order)가 더 크면 ROWNUM 컬럼에 작은 값을 줘서 위로 올린다. INSERT @TBL_TEMP (BD_Num, BD_Group, BD_Order, BD_Depth, BD_Title, BD_Step) -- 임시 테이블 TBL_TEMP에 가져온 레코드 넣기 SELECT * FROM tBD2 WHERE BD_Group = @z; SELECT * FROM @TBL_TEMP ORDER BY BD_Step; -- i변수 1증가 SET @i = @i + 1 END -- 그룹번호(BD_Group)가 z변수와 같은 레코드 가져오기 (같은 그룹번호를 가진 레코드 가져오기) --INSERT INTO @TBL_TEMP (BD_Num, BD_Group, BD_Order, BD_Depth, BD_Title, BD_Step) -- 임시 테이블 TBL_TEMP에 가져온 레코드 넣기 --SELECT * FROM tBD2 --WHERE BD_Group = 2 --ORDER BY BD_Step; -- SELECT ~ ORDER BY : BD_Step 오름차순 정렬됨 -- @TBL_TEMP 테이블 조회해보면 BD_Step 정렬되지 않음 -- 임시 테이블 조회 (결과) SELECT * FROM @TBL_TEMP; COMMIT TRAN -- 내용 반영 END TRY BEGIN CATCH -- CATCH문(에러났을 때) IF @@trancount > 0 -- @@trancount : 트랜잭션의 중첩 수준을 나타내는 시스템 함수 ROLLBACK TRAN -- 트랜잭션 롤백 SELECT ERROR_MESSAGE() END CATCH
MS SQL에서 SELECT해서 INSERT할 때 ORDER BY절로 정렬할 뒤 INSERT하고 싶은데 INSERT된 데이터를 보면 정렬이 되지 않습니다. 검색해보니 SELECT해서 INSERT할 때는 ORDER BY절이 적용되지 않는다고 하는데 혹시 다른 방법이 있을까요?
제가 원하는 정렬이라는게 BD_Group 컬럼별로 GROUP BY를 해서 MAX(BD_Num) 값을 추출하고 MAX(BD_Num) 오름차순을 정렬하여 그 순서대로 데이터를 정렬하는 거에요. 그리고 그룹내 데이터들은 BD_Step 컬럼을 기준으로 오름차순해서 정렬하고요. SELECT * FROM @TBL_TEMP; 여기서 ORDER BY로 BD_Step 컬럼으로 오름차순 정렬하면 BD_Group 컬럼별로 MAX(BD_Num)값이 큰순으로 정렬했던게 무마되기 때문에 정렬한 값을 INSERT하고 싶었던거에요. 그래서 ORDER BY로 정렬하면 제가 원하는 정렬이 아니다 라고 말씀드렸던 겁니다.
제가 아직 데이터베이스 초보자라 생각해낸 방법이 이 방법밖에 없어서 한 번 시도해보다가 궁금하여 글을 남기게 되었습니다. 좋은 방법있으면 알려주시면 감사하겠습니다..! 답변감사합니다.