2013-07-11 36 views
4

我当它是不是null这样用子查询选择避免多次运行?

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的子查询,返回一个整数。

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

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 
+0

我认为要得到一个答案,你需要提供更多关于什么是一个非常复杂的查询的信息,以及它与查询中其他列的关系。你可以用这些结果创建一个临时表,然后用'JOIN'来代替使用'SELECT'的操作系统,然后在'JOINED'行运行你的'CASE'? –

回答

3

所以,如果您的查询的结果都只有一个值或空,你可以使用:

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,因此您可能需要一个OUTER JOIN)。

2

可以嵌套在另一个SELECT返回Col_E查询,并在它的上面添加Col_D,像这样:

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 

这样你就不会需要复制的查询,因为其结果将是可用于外部SELECT

+0

+1。 。 。此解决方案适用于更复杂的情况,即“非常复杂的查询”是相关的子查询。 –