Sql 使用子查询选择是否避免多次运行?

Sql 使用子查询选择是否避免多次运行?,sql,sql-server,Sql,Sql Server,我有一个这样的问题 Select Col_A ,Col_B ,Col_C ,CASE WHEN (SELECT ...{a very complicated query}...) IS NOT NULL THEN 1 ELSE 0 END CASE AS Col_D FROM MyTable 生成Col_D的子查询在不为null时返回一个整数 我需要显示Col_D的位,但我还需要显示它返回的INT。通常,我

我有一个这样的问题

Select 
     Col_A
    ,Col_B
    ,Col_C
    ,CASE 
        WHEN (SELECT ...{a very complicated query}...) IS NOT NULL THEN 1
        ELSE 0
     END CASE AS Col_D
FROM
    MyTable
生成Col_D的子查询在不为null时返回一个整数

我需要显示Col_D的位,但我还需要显示它返回的INT。通常,我会重写子查询并将其命名为colue,但考虑到它的复杂性,我真的不想运行它两次。理想情况下,我会:

Select
     Col_A
    ,Col_B
    ,Col_C
    ,(SELECT ...{a very complicated query}...) AS Col_E
    ,CASE 
        WHEN Col_E IS NOT NULL THEN 1
        ELSE 0
     END CASE AS Col_D
FROM
    MyTable
我有什么选择吗?(MS SQL 2008)

编辑: 抱歉-我应该提到,复杂的查询包含一个基于我的列的where子句,即

SELECT ...{a very complicated query}... WHERE X = Col_A AND Y = Col_B

因此,如果查询结果仅为单个值或null,则可以使用:

Select 
     Col_A
    ,Col_B
    ,Col_C
    ,CASE 
        WHEN t.whatevercol IS NOT NULL THEN 1
        ELSE 0
     END CASE AS Col_D,
    t.whatevercol
FROM
    MyTable, (SELECT ...{a very complicated query}...) t

请务必小心,因为如果存在潜在的多重回报,这可能会导致笛卡尔积。如果有字段可以连接,那么这可能是一种更好的方法(因为您正在检查NULL,所以可能需要外部连接)。

您可以将返回
列的查询嵌套在另一个
选择
,并在其上添加
,如下所示:

SELECT 
     Col_A
    ,Col_B
    ,Col_C
    ,Col_E
    , CASE 
        WHEN Col_E IS NOT NULL THEN 1
        ELSE 0
     END CASE AS Col_D
FROM (
    Select
         Col_A
        ,Col_B
        ,Col_C
        ,(SELECT ...{a very complicated query}...) AS Col_E
    FROM
        MyTable
) X

这样,您就不需要复制查询,因为它的结果将可供外部
选择

获取答案,您需要提供有关
(一个非常复杂的查询)
是什么以及它与查询中其他列的关系的更多信息。您是否可以使用这些结果创建一个临时表,然后使用
选择
连接到该操作系统,然后针对
连接的
行运行
案例
?+1。此解决方案适用于“非常复杂的查询”是相关子查询的更一般情况。