Использовать значение столбца для другого столбца (SQL Server)? - PullRequest
16 голосов
/ 03 марта 2011

Допустим, у меня есть огромный выбор на определенном столе.Одно значение для столбца вычисляется с помощью сложного logc и называется ColumnA .Теперь для другого столбца мне нужно значение из ColumnA и добавить к нему другое статическое значение.

Пример SQL:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...

[ColumnA] + 10 - это то, что я ищу.Сложные вещи это огромный случай / когда блок.

Идеи?

Ответы [ 4 ]

18 голосов
/ 03 марта 2011

Если вы хотите сослаться на значение, которое вычисляется в предложении SELECT, вам нужно переместить существующий запрос в под-SELECT:

SELECT
    /* Other columns */,
    ColumnA,
    ColumnA + 10 as ColumnB
FROM
(select table.id, table.number, complex stuff [ColumnA].. from table ...
) t

Вы должны ввести псевдоним для этой таблицы(как указано выше, t, после закрывающей скобки), даже если вы не собираетесь его использовать.

(Эквивалентно - если вы используете SQL Server 2005 или более позднюю версию - вы можете переместить существующийзапрос в CTE):

;WITH PartialResults as (
     select table.id, table.number, complex stuff [ColumnA].. from table ...
)
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults

CTE имеют тенденцию выглядеть чище, если у вас есть несколько уровней частичных вычислений, то есть, если у вас теперь есть вычисления, которые зависят от ColumnB для включения в вашзапрос.

1 голос
/ 03 марта 2011

Вы можете:

  1. Выполнить + 10 в клиентском коде
  2. Написать скалярную функцию для инкапсуляции логики для complex stuff.Он будет оптимизирован в один вызов.
  3. Скопируйте complex stuff логика для другого столбца.Он должен быть оптимизирован в 1 вызов.
  4. Используйте дополнительный выбор, чтобы применить дополнительный расчет
1 голос
/ 03 марта 2011

Вы можете решить эту проблему с помощью псевдонима подзапроса и столбца .

Вот пример:

SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
      FROM SomeTable t) As SomeTableMaxId
0 голосов
/ 01 июля 2019

К сожалению, в SQL Server 2016:

SELECT 3 AS a, 6/a AS b;

Ошибка: неверное имя столбца: 'a'.

...