2011-05-16 3 views
1

프런트 엔드에서 위쪽/아래쪽 단추를 클릭 할 때 두 행을 바꿔 넣을 테이블 ticket이 있습니다.SQL 쿼리를 사용하여 두 행 바꾸기

이를 위해 ticket_index라는 자동 생성 필드를 추가했습니다. 그러나 나는이 행동을 수행 할 수 없다.

나는 다음 쿼리

UPDATE ticket as ticket1 
    JOIN ticket as ticket2 ON (ticket1.ticket_index = 1 AND ticket2.ticket_index = 4) 
    OR (ticket1.ticket_index = 4 AND ticket2.ticket_index = 1) 
    SET 
     ticket1.ticket_index = ticket2.ticket_index, 
     ticket2.ticket_index = ticket1.ticket_index 

사람이 나에게 올바른 SQL 쿼리를 줄 수를 썼다? 이에 대한 추가 정보가 필요한 경우 알려 주시기 바랍니다. 감사합니다

+0

이 모든 잘못을 보인다

(일) 쿼리이 루틴 요구 (여기서 [예약] 당신이 아래로 이동하려는 티켓의 순서입니다) 따라서인가? ? 이 방법은 적절한 SQL 데이터베이스에서 수행 된 것이 아닙니다 .... 나는'Sequence'라는 열을 추가하는 편이 좋을 것입니다.이 열은 행이 표시되는 순서 ('SELECT (cols) FROM dbo.Ticket ORDER BY Sequence')를 정의합니다. 이걸 사용하면'Sequence' 열의 두 값만 변경하면됩니다. –

+2

'ticket_index' *는 OP의'Sequence'입니다. –

답변

5

사용하는 경우 문, 예컨대 :

update ticket 
set ticket_index = case when ticket_index = :x then :y else :x end 
where ticket_index in (:x, :y); 
+0

OP는 자신의 게시물에'ticket_id' 같은 것을 언급하지 않습니다. WHERE 절은'where ticket_index IN (4, 5)'이어야한다고 생각합니다. 그렇지 않으면 갈 길이 멀어 보인다. –

+0

변수로 변경했습니다. :-) –

+0

안녕 dennis pls이 질문에 당신의 투표를 고맙습니다 나는이 감사를 필요 :) –

0

확실히 두 행을 업데이 트합니까?

UPDATE ticket SET ticket_index = 4 WHERE ticket_id = 18 

UPDATE ticket SET ticket_index = 5 WHERE ticket_id = 301 

간단한 트랜잭션을 사용하여 두 레코드를 모두 업데이트하십시오.

+0

'ticket_index'에 고유성을 적용 할 경우이 문제가 발생합니까? – JNK

+0

네, 그러면 더 많은 스키마 정보가 필요합니다. – Fenton

+0

이 문제는 다음 쿼리 UPDATE 티켓 SET로 해결됩니다. ticket_index = (사례 번호 ticket_index = 10 THEN 20 WHEN ticket_index = 20 THEN 10 END) where ticket_index IN (20, 10) 여기서 ticket_index는 자동 증가 열이므로 문제가 발생합니다. 내가 그걸 꺼야 할 때마다 다른 해결책이 있습니까? –

2

ticket_index 필드는 ID (자동 증가 정수) 필드이므로 전 세계에서 왜 이러한 인덱스를 바꾸시겠습니까? 귀하의 질문을 기반으로, 그것은 정말로 당신이 찾고있는 것처럼 보이는데 그것은 인덱스/프라이 머리 키와 정말로 독립적이어야하는 정렬 순서를 관리하는 방법입니다. 귀하의 질문에 대답하지 않는다는 것을 알고 있지만 정렬 순서를 제어하기 위해 별도의 열을 추가하는 것이 좋습니다.

+0

seprate 열을 추가했지만이 레코드를 삽입하는 대신이 autoincrement를 만들었습니다. 매번 최대 값을 가져 오는 것에 대해 걱정할 필요가 없으므로 +1을 추가하는 등의 작업을 수행했습니다. –

+1

"Identity"열은 실제로 의미가 없습니다. 이것 때문에. 가장 좋은 방법은 삽입 트리거를 사용하여 ID 동작을 모방하는 것입니다. 또한 중요한 문제없이 스와핑을 수행 할 수 있도록 열에 고유 한 제한 조건을 두지 않는 것이 좋습니다. – Keith

+0

안녕 키스, pls이 질문에 당신의 투표를 올린 내가 고마워 : –

0

가정 : 당신이 주문 열이 (예를 들어, ticket_order).

관찰 : ticket_order N down을 사용하여 티켓을 이동하는 것은 ticket_order N + 1을 사용하여 티켓을 이동하는 것과 동일한 효과가 있으므로 두 요소 (위 또는 아래로 이동 여부)를 바꾸는 데 하나의 루틴 만 있으면됩니다.

이 경우 우리는 하나의 매개 변수 만 필요로하는 "이동 다운 루틴"을 만듭니다. 이동하려는 티켓의 순서. 그러나 최종 질의는 주문을 교환하려는 두 티켓을 고유하게 식별하기 위해 더 많은 인수가 필요할 수 있습니다. 예를 들어 티켓 카테고리를 추가해야 할 수도 있습니다. - 왜 교체해야합니까

UPDATE tickets 
SET ticket_order = 2 * [order] - ticket_order + 1 
WHERE ticket_order IN ([order], [order]+1) 
(and possibly additional arguments here to further identify the tickets) 
관련 문제