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)
使用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)
这与您之前的问题非常相似: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)
如果可以找到这两行,则此查询仅更新,否则不执行任何操作.