То, что вы описываете, невозможно в SQL по очень конкретной причине.В списке SELECT
все столбцы должны вычисляться (создаваться, разрешаться) одновременно или как если бы они рассчитывались (создавались, разрешались) одновременно.Или, другими словами, дать тот же результат в любом порядке, в котором они рассчитаны.
Это означает, что псевдоним столбца нельзя использовать (ссылаться) в вычислениях другого столбца.
Если то, что вы описали, было возможно, у нас могли бы быть циклические ссылки типа:
SELECT SUM(a)*sb AS sa
, SUM(b)*sa AS sb
FROM aTable
который, конечно, должен быть отклонен как ошибка.И это было бы довольно просто, если добавить в анализатор запросов уровень, который проверяет циклические ссылки (существует циклическая ссылка: отклонить запрос)
Но как рассчитать результат этого:
SELECT SUM(a) AS b
, SUM(b) AS a
FROM aTable
или почему он должен быть отклонен?
Если в таблице нет столбцов a
и b
, хорошо, это было бы легко (существует циклическая ссылка: отклонить запрос).Но если есть столбцы a
и b
, это круговая ссылка или нет?Является ли b
в SUM(b)
неоднозначной ссылкой?Это относится к столбцу b
или к псевдониму b
?
Кстати, второй является допустимым запросом SQL.Поскольку SQL предполагает, что все вычисления выполнены (SUM(a)
и SUM(b)
здесь), а затем псевдонимы присваиваются результатам.То же самое происходит с:
UPDATE aTable
SET a=b
, b=a
, который фактически меняет данные в двух столбцах.Когда ты пишешь это так, это не очень понятно, пока ты не попробуешь.Есть альтернативный, более красивый способ, который дает лучшее представление о том, что происходит в фоновом режиме (пока не все РСУБД поддерживают это):
UPDATE aTable
SET (a,b)=(b,a)