2011-05-16 95 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)