MS SQL에서 SELECT해서 INSERT 할 때 ORDER BY절에 대해서 질문있습니다. 0 5 987

by ALSWL MSSQL [2020.11.02 16:47:19]


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절이 적용되지 않는다고 하는데 혹시 다른 방법이 있을까요?

by 마농 [2020.11.02 17:33:39]

MSSQL 의 테이블 자료는 PK 기준으로 Cluster 되어 들어갑니다.
왜 굳이 정렬하여 집어 넣으려고 하나요?
꺼낼 때 정렬하여 꺼내면 되는데요.


by ALSWL [2020.11.02 17:58:23]

정렬을 해서 넣어야 제가 원하는 결과가 나와서 정렬을 해서 넣으려고 합니다. 코드에서 제가 원하는 결과 값이 SELECT * FROM @TBL_TEMP;에서 나오는데 여기서 ORDER BY로 정렬하면 제가 원하는 정렬이 아니여서..그렇습니다.


by 마농 [2020.11.03 07:53:19]

"ORDER BY로 정렬하면 제가 원하는 정렬이 아니다" 라는 말이 이상합니다.
원하는 정렬 순서에 맞도록 ORDER BY 를 구현하시면 됩니다.


by ALSWL [2020.11.03 09:39:26]

제가 원하는 정렬이라는게 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로 정렬하면 제가 원하는 정렬이 아니다 라고 말씀드렸던 겁니다. 

제가 아직 데이터베이스 초보자라 생각해낸 방법이 이 방법밖에 없어서 한 번 시도해보다가 궁금하여 글을 남기게 되었습니다. 좋은 방법있으면 알려주시면 감사하겠습니다..! 답변감사합니다.


by 마농 [2020.11.03 11:03:58]
SELECT *
  FROM tBD2 
 ORDER BY MAX(BD_Num) OVER(PARTITION BY BD_Group) DESC
     , BD_Step
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입