Могу ли я использовать столбец, рассчитанный в представлении SQL Server, позже в этом же представлении? - PullRequest
2 голосов
/ 22 декабря 2011

Могу ли я использовать столбец, вычисленный в представлении SQL Server, позже в этом же представлении?

Допустим, у меня есть следующий вид:

Select 
    t1.StartMile, t2.EndMile,  t2.EndMile- t1.StartMile as TotMile
from 
   TableStarts as t1 
inner join 
   TableEnds as t2 on t1.Id = t2.Id  

Есть ли способ отредактировать вид, чтобы сделать следующее

Select  
    t1.StartMile, t2.EndMile, t2.EndMile - t1.StartMile as TotMile, 
    TotMile + 30  as EvenMoreMiles

Я попробовал это и получил ошибку:

Неверное имя столбца 'TotMile'

Пожалуйста, не говорите мне использовать t2.EndMile - t1.StartMile + 30 as EvenMoreMiles. TotMiles является длинным регистром в моем реальном коде.

Мне скорее не нужно создавать промежуточное представление.

Я использую SQL Server 2005.

ДОБАВЛЕНО ПОЗЖЕ

Спасибо за все ответы. Я буду голосовать за всех.

Ответы поднимают следующий новый вопрос:

Учитывая, что строк тысячи, а TotMiles выглядит следующим образом, какой из приведенных ответов будет наиболее эффективным? Или было бы наиболее эффективно создать промежуточное представление?

CASE WHEN t .TaskType = 1  and  t .StartTime < '1/1/2012'  
               THEN (tv.EndMile - tv.StartMile )  
     WHEN NOT (t .Location1_PKey = c.pkey OR t .Location2_PKey = c.pkey)
              then (tv.EndMile - tv.StartMile )
     WHEN (tv.EndMile - tv.StartMile ) < 31  Then 0 
     ELSE  (tv.EndMile - tv.StartMile - 30 )
END AS MilesAdjusted2012,

Ответы [ 4 ]

9 голосов
/ 22 декабря 2011

Вы также можете использовать CROSS APPLY, что может быть более кратким, особенно если вы создаете цепочки псевдонимов, которые ссылаются на предыдущие.

SELECT t1.StartMile,
       t2.EndMile,
       TotMile,
       EvenMoreMiles,
       AndYetMoreMiles
FROM   TableStarts AS t1
       INNER JOIN TableEnds AS t2
         ON t1.Id = t2.Id
       CROSS APPLY (SELECT t2.EndMile - t1.StartMile) A(TotMile)
       CROSS APPLY (SELECT TotMile + 30) A2(EvenMoreMiles)
       CROSS APPLY (SELECT EvenMoreMiles + 100) A3(AndYetMoreMiles)  
3 голосов
/ 22 декабря 2011

Вы не можете напрямую, но вы можете создать подвыборы:

select StartMile,EndMile,TotMile,TotMile+30 as EvenMoreMiles from (
  Select t1.StartMile, t2.EndMile,  t2.EndMile- t1.StartMile as TotMile
  from 
  TableStarts as t1 
  inner join 
  TableEnds as t2 
  on t1.Id = t2.Id  
) t

или использовать общие выражения таблиц:

;with FirstCalcs as (
  Select t1.StartMile, t2.EndMile,  t2.EndMile- t1.StartMile as TotMile
  from 
  TableStarts as t1 
  inner join 
  TableEnds as t2 
  on t1.Id = t2.Id  
)
select StartMile,EndMile,TotMile,TotMile+30 as EvenMoreMiles from FirstCalcs

Я обычно предпочитаю использовать CTEесли будет несколько уровней, которые строят окончательные расчеты, потому что в противном случае большинство схем форматирования затрудняют чтение, выбор, суб-выбор и т. д., чтобы их было легко прочитать.CTE могут включать ссылки на ранее определенные CTE:

;with CTE1 as (
    SELECT ...
), CTE2 as (
    SELECT ... FROM CTE1
), CTE3 as (
    SELECT ... FROM CTE2
), CTE4 as (
    SELECT ... FROM CTE2 ... CTE3
)
SELECT ... FROM CTE4 ... CTE1
1 голос
/ 22 декабря 2011

Вы можете сделать это с помощью Common Table Expression (CTE). Много на этом здесь: http://www.4guysfromrolla.com/webtech/071906-1.shtml

В основном,

CREATE VIEW ... AS

WITH Mileage (StartMile, EndMile, TotMile) AS (Select t1.StartMile, t2.EndMile,  t2.EndMile- t1.StartMile as TotMile
from 
TableStarts as t1 
inner join 
TableEnds as t2 
on t1.Id = t2.Id) 

SELECT TotMile FROM Mileage
1 голос
/ 22 декабря 2011

Попробуйте использовать производную таблицу.

SELECT 
  DerivedTable.*,
  TotMile + 30 as EvenMoreMiles
From (Select 
        t1.StartMile, 
        t2.EndMile, 
        t2.EndMile- t1.StartMile as TotMile
        FROM Table t1 
        Inner Join table2 t2 on t1.PK = t2.FK) DerivedTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...