如何在where子句中使用预先使用的子查询?

时间:2012-02-02 21:23:17

标签: sql sql-server

我正在整理一个长期的查询,经过多次实验,我发现我只能通过子查询来完成。

子查询将与包含财务期间列表的根表连接。我想通过引用where子句中的子查询来过滤结果,而不重复子查询。

IE:

Select  Year
        , Period
        , (Select.... ) as Col1
        , (Select.... ) as Col2
        , (Select.... ) as Col3
Where   Col1 > 0 or Col2 > 0 or Col3 > 0

我知道我不能用给定的名称引用子查询,我已经考虑过用数字引用,但是没有看到任何承诺。我最终做的是将查询放在一个存储过程中,该过程使用它来填充临时表并从具有相应where子句的表中进行选择。

Select .... into #Temp
Select * From #Temp Where Col1 > 0 or Col2 > 0 or Col3 > 0

是否有更清洁或更有效的方法来解决这个问题?

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

如果您使用的是SQL Server 2005或更高版本,则可以use a CTE

;WITH Result (Year, Period, Col1, Col2, Col3) AS
(
    Select Year, Period, (Select.... ) as Col1, (Select.... ) as Col2...
)
Select *
From Result
Where Col1 > 0 or Col2 > 0 or Col3 > 0

或者,如果您使用的是不支持CTE的版本,则可以将查询视为中间结果,然后使用外部查询应用过滤:

Select
    *
from
(
    Select Year, Period, (Select.... ) as Col1, (Select.... ) as Col2...
) q
Where Col1 > 0 or Col2 > 0 or Col3 > 0