使用temp列过滤结果

时间:2013-05-04 11:05:15

标签: sql sql-server-2008 tsql

我的查询是这样的。

select id,name,salary,(salary-2000) AS [Deductedsalary]  
from EmployeeDetails

我想在where子句中使用[Deductedsalary]列,类似于下面的查询。

select 
    id, name, salary, (salary-2000) AS [Deductedsalary]  
from 
    EmployeeDetails 
where 
    [Deductedsalary] > 5000

注意:我不想将过滤查询与'salary'列

一起使用

4 个答案:

答案 0 :(得分:2)

您无法直接执行此操作 - 您必须在基础Salary列上进行过滤,或使用类似CTE的内容:

WITH CTE AS 
(
   SELECT
       id, name, salary, 
       DeductedSalary = salary - 2000
   FROM
       dbo.EmployeeDetails 
)
SELECT 
   id, name, salary, DeductedSalary
FROM 
   CTE
WHERE
   [Deductedsalary] > 5000

答案 1 :(得分:2)

您可以使用子查询来定义别名:

select  *
from    (
        select  salary-2000 as deducted_salary
        ,       *
        from 
                EmployeeDetails 
        ) SubQueryAlias
where   Deductedsalary > 5000

答案 2 :(得分:2)

另一种方法是

SELECT id,
       name,
       salary,
       DeductedSalary
FROM   EmployeeDetails
CROSS APPLY (SELECT salary-2000) DS(DeductedSalary)
WHERE  DeductedSalary > 5000 

虽然我使用

SELECT id,
       name,
       salary,
       ( salary - 2000 ) AS [Deductedsalary]
FROM   EmployeeDetails
WHERE  [salary] > 7000 

因为这是可以攻击的(可以使用索引并且会有更好的基数估计值)

答案 3 :(得分:1)

你可以尝试

Select *
    FROM
    (
        select 
          id, name, salary, (salary-2000) AS [Deductedsalary]  
        from 
           EmployeeDetails 

    ) data
    where 
          [Deductedsalary] > 5000