2011-05-16 94 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數據庫中完成....我寧願添加一個名爲「序列」的列,它定義了您的行出現的順序('SELECT(cols)FROM dbo.Ticket ORDER BY Sequence')有了這個,你只需要改變'Sequence'列中的兩個值,這就是你所需要的...... – 2011-05-16 14:10:15

+2

也許'ticket_index' *是OP的'Sequence'。 – 2011-05-17 05:47:52

回答

5

使用case語句,例如:

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)'。否則,似乎要走。 – 2011-05-17 05:46:21

+0

將其更改爲變量。 :-) – 2011-05-17 05:55:29

+0

嗨丹尼斯請你提高對這個問題的投票我需要這個謝謝:) – 2012-07-10 13:08:05

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 2011-05-16 13:51:54

+0

是的,它會...更多的模式信息所需的那一個。 – Fenton 2011-05-16 13:53:37

+0

我解決以下查詢UPDATE票SET這個問題ticket_index = (CASE WHEN ticket_index = 10,則20 WHEN ticket_index = 20 THEN 10 END)WHERE ticket_index IN(20,10),但這裏出現的是ticket_index問題是自動增量列,因此每次我必須關閉它,是否還有其他解決方案? – 2011-05-16 14:00:05

2

由於您的ticket_index字段是一個標識(自動遞增整數)字段,爲什麼在世界上你想要交換這些索引?根據你的問題,這聽起來像你真正想要的是一種管理排序順序的方法,它應該獨立於索引/主鍵。我知道這並不回答你的問題,但我的建議是添加一個單獨的列來控制排序順序。

+0

我添加了一個seprate列,但不是插入記錄在這個我做了這個自動增量,以便每次我不需要打擾獲取最大值然後添加+1等。 – 2011-05-16 14:11:39

+1

「身份」列並不是真的意思爲了這。您最好的選擇可能是使用插入觸發器來模擬身份行爲。我還建議不要在列上放置一個唯一的約束,這樣可以在沒有任何重大問題的情況下進行交換。 – Keith 2011-05-16 14:28:17

+0

嗨基思,請將您的投票提升到這個問題我需要它謝謝:) – 2012-07-10 13:08:29

0

假設:您有一個順序列(例如ticket_order)。

觀察:使用ticket_order N向下移動票證與使用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)