2011-12-20 4 views
0

У меня есть T-SQL большой запрос:SQL Server: получить данные переменной в запросе в-запросе использования

SELECT (... some big subquery ...), 
    (... some big subquery ...)/field1, 
    CASE WHEN (... some big subquery ...) = 0 THEN ... ELSE ... END 
FROM table 
WHERE (... some big subquery ...) IS NOT NULL 

Есть ли способ сделать это в тузд образом:

SELECT @big_query_result := (... some big subquery ...), 
    @big_query_result/field1, 
    CASE WHEN @big_query_result = 0 THEN ... ELSE ... END 
FROM table 
WHERE @big_query_result IS NOT NULL 

?

ответ

0

Вы можете использовать подзапрос, чтобы дать «большой запрос» псевдоним, как:

select BigQueryResult 
,  BigQueryResult/field1 
,  case when BigQueryResult = 0 then ... else ... end 
from (
     select (... some big subquery ...) as BigQueryResult 
     ,  ... other columns ... 
     from  table 
     ) as SubQueryAlias 
2

Использовать общее табличное выражение для этого:

;WITH CTE_Results AS 
(
SELECT ID, (SOME BIG SUB QUERY) AS SubResult FROM table 
) 
SELECT 
RES.SubResult 
, RES.SubResult/TBL.field1 
, CASE WHEN RES.SubResult = 0 THEN... ELSE ... END AS FieldName 
FROM table TBL 
INNER JOIN CTE_Results RES 
ON TBL.ID = RES.ID 
WHERE RES.SubResult IS NOT NULL 
+0

Следует отметить, что использование псевдонима не будет работать для вас, поскольку вам нужно использовать его в предложении Where, а псевдоним не может использоваться в вашем предложении where. – Charl

+0

Чтобы уточнить, Шарль означает, что использование псевдонима в предложении WHERE вашего примера MySQL не будет работать. SQL Server допускает псевдонимы в предложении WHERE, и, таким образом, псевдоним «WHERE RES.SubResult» в его ответе действителен. –

+0

Джонатан, это не то, что я имею в виду; -> Это для MSSQL. Табличные псевдонимы действительны в предложениях WHERE, но не для псевдонимов столбцов для столбцов, которые вычисляются в вашем заявлении select. Использование CTE означает, что нам не нужно использовать и псевдоним вычисленного столбца в предложении select, но мы по-прежнему используем псевдоним таблицы RES. Надеюсь, теперь это становится яснее. – Charl

Смежные вопросы