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

标签 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

我知道我无法通过给定名称引用子查询,并且我已经研究过通过数字引用,但没有看到任何 promise 。我最终所做的是将查询放入存储过程中,该存储过程使用它来填充临时表,并使用适当的 where 子句从中进行选择。

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

有没有更干净或更有效的方法来解决这个问题?

有什么想法吗?

最佳答案

如果您使用的是 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

关于sql - 如何在 where 子句中使用预先使用的子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9120212/

相关文章:

sql - ORA-01427:单行子查询在CASE语句中返回多个行

php - 如何从数组中获取与至少一个值匹配的所有行?

sql - SSIS 错误 : The attempt to add a row to the Data Flow task buffer failed with error code 0xC0047020

sql - 如何在 SQL SERVER 中仅提取电子邮件 ID

c# - 需要用异步数据库请求返回SqlDataReader

Python:Pyodbc 执行带参数的存储过程

sql - 语法问题 SQL Server。结合 Pivot、XML 解析和 JOIN

mysql - 在一个时间范围内分组为 5 分钟的间隔

c# - c# 中的 T-SQL 语句中的语法不正确

c# - 客户数据库还是统一数据库哪个更好?