Переключение значений двух полей / столбцов в SQL Server без третьей переменной - PullRequest
9 голосов
/ 13 октября 2011

В результате ошибки при импорте в тестовую таблицу с именем CUSTOMERS я обнаружил, что мне нужно переключить значения двух столбцов в SQL Server.

Я по ошибке импортировал соответствующие значения для LASTNAME и FIRSTNAME в противоположные поля (то есть фамилия клиента была импортирована в имя и наоборот). Чтобы исправить это, я запустил следующий запрос в SQL Server 2008 R2, конечно, не ожидая, что он будет работать:

UPDATE CUSTOMERS
SET LASTNAME=FIRSTNAME, FIRSTNAME=LASTNAME

Удивительно, но это сработало! Мой ограниченный опыт программирования (средняя школа, несколько курсов в колледже) всегда следовал парадигме, согласно которой переключение двух значений требует наличия третьей переменной, чтобы «удерживать» значение одного из начальных значений. Другими словами, я ожидал выполнить следующий запрос:

UPDATE CUSTOMERS
SET SOMEOTHERFIELD = LASTNAME
SET LASTNAME = FIRSTNAME
SET FIRSTNAME = SOMEOTHERFIELD

Такое поведение наблюдается только в SQL Server 2008 R2, или это представляет какой-то другой основной аспект реляционной теории, который мне не хватает?

Ответы [ 4 ]

5 голосов
/ 13 октября 2011

Это потому, что работает обновление:

В предложении set создается псевдотаблицаСтроки в этой таблице создаются путем копирования значений из столбцов, которые не упомянуты из исходной строки, в новую строку.Столбцы назначаются все сразу.То есть единицей работы является строка, а не один столбец за раз.Последний шаг - удалить старые строки и вставить новые.Внутри обновления выбирается, удаляется, вставляется.

4 голосов
/ 13 октября 2011

Это по той же причине, по которой вы не можете определить псевдоним столбца в списке SELECT, а затем ссылаться на псевдоним в другом месте этого же списка SELECT. Цитировать Джо Селко

В SQL все происходит "сразу", а не "слева направо", как они будет в последовательной файловой / процедурной языковой модели

Выражения, которые появляются на одной и той же фазе обработки логического запроса, оцениваются как в один и тот же момент времени. Подробнее об операциях «все за один раз» см. по этой ссылке.

2 голосов
/ 13 октября 2011

Полагаю, исходные значения подготавливаются первыми (и, таким образом, сохраняются во внутреннем третьем держателе) и применяются позже.

0 голосов
/ 13 октября 2011

Операторы SQL Update должны одновременно обновлять столбцы, указанные в операторе UPDATE, в большинстве СУБД.Приятно учиться на собственном опыте:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...