SQL UPDATE для переключения двух значений в две строки
Я использую SQL Server для замены двух значений в две строки. Позвольте мне показать:
[ord] [name]
1 John
4 Jack
7 Pete
9 Steve
11 Mary
Скажем, мне нужно поменять [ord] номера для "Пит" и "Стив", чтобы сделать эту таблицу такой:
[ord] [name]
1 John
4 Jack
9 Pete
7 Steve
11 Mary
Это похоже на тривиальную задачу, но я не могу написать инструкцию SQL UPDATE для нее.
Ответы
Ответ 1
Если 'Peter'
и 'Steve'
уникальны в вашей таблице, это будет делать:
UPDATE TableX
SET ord = ( SELECT MIN(ord) + MAX(ord)
FROM TableX
WHERE name IN ('Peter', 'Steve')
) - ord
WHERE name IN ('Peter', 'Steve')
или (улучшено с помощью @Erwin):
UPDATE TableX
SET ord = ( SELECT SUM(ord)
FROM TableX
WHERE name IN ('Peter', 'Steve')
) - ord
WHERE name IN ('Peter', 'Steve')
Ответ 2
Это очень похоже на ваш предыдущий вопрос: SQL для перемещения строк вверх или вниз в двухэтажной компоновке
Я подготовил для вас еще demo на 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;
Этот запрос обновляется только в том случае, если обе строки могут быть найдены и ничего не делают.
Ответ 3
Используйте выражение CASE:
UPDATE yourtable
SET [ord] = CASE [ord] WHEN 9 THEN 7
WHEN 7 THEN 9 END
WHERE [ord] IN (7, 9)
Ответ 4
UPDATE Table_1
SET ord =
CASE name
WHEN 'Pete' THEN (SELECT ord FROM Table_1 WHERE name = 'Steve')
WHEN 'Steve' THEN (SELECT ord FROM Table_1 WHERE name = 'Pete')
END
WHERE name IN ('Pete', 'Steve')
Вы можете легко заменить "Пит" и "Стив" другими именами...
Ответ 5
BEGIN TRANSACTION
UPDATE TABLENAME
SET ord = 9
where name = 'Pete'
UPDATE TABLENAME
SET ord = 7
where name = 'Steve'
COMMIT TRANSACTION