SQL UPDATE для переключения двух значений в две строки - программирование
Подтвердить что ты не робот

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 для нее.

4b9b3361

Ответ 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