SQL UPDATE语句用于在两行中切换两个值

ahm*_*md0 16 sql t-sql sql-server sql-update

我正在使用SQL Server在两行中交换两个值.让我展示:

[ord] [name]
1     John
4     Jack
7     Pete
9     Steve
11    Mary
Run Code Online (Sandbox Code Playgroud)

说,我需要交换[ord]数字为"Pete"和"Steve"使这个表格像这样:

[ord] [name]
1     John
4     Jack
9     Pete
7     Steve
11    Mary
Run Code Online (Sandbox Code Playgroud)

这似乎是一项微不足道的任务,但我似乎无法为它编写SQL UPDATE语句.

ype*_*eᵀᴹ 19

如果'Peter'并且'Steve'在您的表中是唯一的,这将做:

UPDATE TableX
SET ord = ( SELECT MIN(ord) + MAX(ord) 
            FROM TableX 
            WHERE name IN ('Peter', 'Steve')
          ) - ord
WHERE name IN ('Peter', 'Steve')
Run Code Online (Sandbox Code Playgroud)

或(由@Erwin改进):

UPDATE TableX
SET ord = ( SELECT SUM(ord) 
            FROM TableX 
            WHERE name IN ('Peter', 'Steve')
          ) - ord
WHERE name IN ('Peter', 'Steve')
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 7

使用CASE表达式:

UPDATE yourtable
SET [ord] = CASE [ord] WHEN 9 THEN 7
                       WHEN 7 THEN 9 END
WHERE [ord] IN (7, 9)
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 7

这与您之前的问题非常相似:SQL以两表排列方式向上或向下移动行
在data.stackexchange.com上为您准备了另一个演示.

编辑:现在简化了设置,因此我相应地简化了查询.

WITH x AS (SELECT name, ord FROM t WHERE name = 'Pete')  -- must be unique!
   , y AS (SELECT name, ord FROM t WHERE name = 'Steve') -- must be unique!
UPDATE t
SET    ord = z.ord
FROM  (
   SELECT x.name, y.ord FROM x,y
   UNION  ALL
   SELECT y.name, x.ord FROM x,y
   ) z
WHERE t.name = z.name;
Run Code Online (Sandbox Code Playgroud)

如果可以找到这两行,则此查询仅更新,否则不执行任何操作.