Ответ 1
Вы можете попробовать что-то вроде этого.
SELECT
A.Val AS A,
B.Val AS B,
C.Val AS C
FROM MYTABLE
cross apply(select 1 + 2) as A(Val)
cross apply(select A.Val + 3) as B(Val)
cross apply(select B.Val * 7) as C(Val)
У меня есть много вычисленных столбцов, и они продолжают отбивать себя, один внутри других, включая вложенные заявления о случаях.
Существует действительно упрощенная версия чего-то, что я искал способ сделать.
SELECT
(1+2) AS A,
A + 3 AS B,
B * 7 AS C
FROM MYTABLE
Спасибо заранее.
Вы можете попробовать что-то вроде этого.
SELECT
A.Val AS A,
B.Val AS B,
C.Val AS C
FROM MYTABLE
cross apply(select 1 + 2) as A(Val)
cross apply(select A.Val + 3) as B(Val)
cross apply(select B.Val * 7) as C(Val)
Вы не можете ссылаться на только что созданные выражения, позже ссылаясь на их псевдонимы столбцов. Подумайте о том, что весь список выбран как материализованный в одно и то же время или в случайном порядке - A еще не существует, когда вы пытаетесь сделать выражение для создания B. Вам нужно повторить выражения - я не думаю, что вы 'можно будет сделать "более простые" вычисленные столбцы, не повторяя их, и просмотрит их же - вам придется вложить вещи, например:
SELECT A, B, C = B * 7
FROM
(
SELECT A, B = A + 3
FROM
(
SELECT A = (1 + 2)
) AS x
) AS y;
Или повторите выражение (но я думаю, это то, чего вы пытаетесь избежать).
Другой вариант, если кому-то все еще интересно:
with aa(a) as ( select 1+2 )
, bb(b) as ( select a+3 from aa )
,cc(c) as ( select b*7 from bb)
SELECT aa.a, bb.b, cc.c
from aa,bb,cc
Единственный способ "сохранить" результаты ваших вычислений будет использовать их в подзапросе, таким образом вы можете использовать A, B and C
. К сожалению, это невозможно сделать другим способом.
Вы можете создать вычисленные столбцы, чтобы представить нужные значения. Кроме того, вы можете использовать вид, если ваши вычисления зависят от данных в отдельной таблице.
Вы хотите, чтобы результаты вычислялись из таблицы? В этом случае вы можете поместить соответствующие вычисления в функцию, зависящую от скалярного значения, и использовать ее внутри оператора select
.
Или вы хотите, чтобы вычисленные результаты отображались в виде столбцов в таблице, а затем используйте вычисленный столбец:
CREATE TABLE Test(
ID INT NOT NULL IDENTITY(1,1),
TimesTen AS ID * 10
)