SQL 질문과 답변 게시판
Microsoft SQL Server와 관련된 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
글 수 5,150
안녕하세요...
테이블 아래와 같이 데이터가 있는데요...
no aa
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
이것을 select 해서 웹페이지 listbox 에 바인딩 해서 업, 다운 버튼으로 no 순서 변경해서 저장 누르면 DB에 다시 저장되게 하려는데요
ListBox
1
2
3
4
5
6
9
10
7
8
|
UP |
DOWN |
이상태에서 저장 누르면 테이블에 다음과 같이 저장되야 합니다.
no aa
1 a
2 b
3 c
4 d
5 e
6 f
7 i
8 j
9 g
10 h
변경된 순서를 적용하고 다시 no 를 순서대로 메기고 row 자체가 변경되어야 하거든요 단순히 no 값만 변경하는게 아니고요... 어찌 해야 하나요?


UP / DOWN 할때 마다 DB CALL 을 하는 경우 입니다.
구현은 아래 스크립트를 참고하시면 됩니다.
하지만 아래 스크립트는 성능상 취약점을 가지고 있습니다.
no, aa 칼럼 외에 ordering 칼럼을 추가하셔서 구현하시길 권장합니다.
select 1 as rn, '1' as value into TEST union all
select 2 as rn, '2' as value union all
select 3 as rn, '3' as value union all
select 4 as rn, '4' as value union all
select 5 as rn, '5' as value union all
select 6 as rn, '6' as value union all
select 7 as rn, '7' as value union all
select 8 as rn, '8' as value union all
select 9 as rn, '9' as value union all
select 10 as rn, '10' as value
-- RN = 10번 UP
declare @RN int
set @RN = 10
update TEST set
RN = case when RN = @RN then @RN - 1 else @RN end
where RN in ( @RN, @RN - 1 );
select * from TEST order by RN
-- RN = 9번 UP
declare @RN int
set @RN = 9
update TEST set
RN = case when RN = @RN then @RN - 1 else @RN end
where RN in ( @RN, @RN - 1 );
select * from TEST order by RN
-- RN = 1번 DOWN
declare @RN int
set @RN = 1
update TEST set
RN = case when RN = @RN then @RN + 1 else @RN end
where RN in ( @RN, @RN + 1 );
select * from TEST order by RN