Подтвердить что ты не робот

Как повторно использовать вычисленные столбцы, избегая дублирования инструкции sql?

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

Существует действительно упрощенная версия чего-то, что я искал способ сделать.

SELECT 
    (1+2) AS A, 
    A + 3 AS B, 
    B * 7 AS C 
FROM MYTABLE

Спасибо заранее.

4b9b3361

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

Ответ 2

Вы не можете ссылаться на только что созданные выражения, позже ссылаясь на их псевдонимы столбцов. Подумайте о том, что весь список выбран как материализованный в одно и то же время или в случайном порядке - A еще не существует, когда вы пытаетесь сделать выражение для создания B. Вам нужно повторить выражения - я не думаю, что вы 'можно будет сделать "более простые" вычисленные столбцы, не повторяя их, и просмотрит их же - вам придется вложить вещи, например:

SELECT A, B, C = B * 7
FROM
(
  SELECT A, B = A + 3
  FROM 
  (
    SELECT A = (1 + 2)
  ) AS x
) AS y;

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

Ответ 3

Другой вариант, если кому-то все еще интересно:

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

Ответ 4

Единственный способ "сохранить" результаты ваших вычислений будет использовать их в подзапросе, таким образом вы можете использовать A, B and C. К сожалению, это невозможно сделать другим способом.

Ответ 5

Вы можете создать вычисленные столбцы, чтобы представить нужные значения. Кроме того, вы можете использовать вид, если ваши вычисления зависят от данных в отдельной таблице.

Ответ 6

Вы хотите, чтобы результаты вычислялись из таблицы? В этом случае вы можете поместить соответствующие вычисления в функцию, зависящую от скалярного значения, и использовать ее внутри оператора select.

Или вы хотите, чтобы вычисленные результаты отображались в виде столбцов в таблице, а затем используйте вычисленный столбец:

CREATE TABLE Test(
    ID INT NOT NULL IDENTITY(1,1),
    TimesTen AS ID * 10
)