Как повторно использовать вычисляемые столбцы, избегая дублирования оператора SQL? - PullRequest
28 голосов
/ 28 июля 2011

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

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

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

Заранее спасибо.

Ответы [ 6 ]

22 голосов
/ 29 июля 2011

Вы можете попробовать что-то вроде этого.

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)
8 голосов
/ 29 июля 2011

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

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

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

6 голосов
/ 09 мая 2013

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

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
1 голос
/ 28 июля 2011

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

1 голос
/ 28 июля 2011

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

0 голосов
/ 28 июля 2011

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

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

CREATE TABLE Test(
    ID INT NOT NULL IDENTITY(1,1),
    TimesTen AS ID * 10
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...