使用子查询中的select语句中的值

时间:2015-08-18 14:48:31

标签: sql sql-server tsql

我有类似的东西(伪代码):

select 
case when (condition) then t1.value else (select value from t2) end as MyVal,
case when (condition) then t1.secondValue else (select value from t3 where x = MyVal) end as WhyDoesntThisWork
from t1

正如您所看到的,在第二种情况下,我们有where x = MyVal,并且它不允许我使用MyVal。有没有在子查询中使用MyVal的简单方法?

3 个答案:

答案 0 :(得分:1)

如果您使用的是SQL Server 2005和更新的(tsql标记,则表示您使用的是SQL Server DBMS),您可以使用outer apply

select 
    CALC.MyVal,
    case 
       when (condition) then t1.secondValue 
       else (select value from t3 where x = CALC.MyVal) 
    end as WhyDoesntThisWork
from t1
    outer apply (select 
                  case 
                       when (condition) then t1.value 
                       else (select value from t2) 
                  end as MyVal
    ) as CALC

答案 1 :(得分:0)

简短的回答,你不能因为Myval在那个背景下不存在。将在完成处理后创建。

根据您的RDBMS,您可以创建CTE。

或者只是重复一下代码。

select 
    case 
        when (condition) then t1.value 
        else (select value from t2) 
    end as MyVal,
    case 
        when (condition) then t1.secondValue 
        else (select value 
              from t3 
              where x = case 
                           when (condition) then t1.value 
                           else (select value from t2) 
                        end
             ) 
    end as WhyDoesntThisWork
from t1

答案 2 :(得分:0)

您的查询中存在一些问题:

  • 您不能使用列别名MyVal来计算另一列,因为它不在特定select语句的范围内。
  • 下一个问题是在您的case语句中,您尝试使用子查询中的值而不使用任何过滤器或连接(例如select value from t2)。这将返回表t2中的所有行,因此会返回错误:
  

消息512,级别16,状态1,行2子查询返回的值超过1   值。

在这里做一些假设,您可以使用CTE或子查询在外部查询中使用MyVal别名,如下所示:

SELECT t.id
    ,t.MyVal
    ,CASE 
        WHEN (condition)
            THEN t.secondValue
     ELSE t3.value
     END AS ThisWorksNow
FROM (
    SELECT id
         ,CASE 
            WHEN (condition)
                THEN t1.value
          ELSE t2.value
          END AS MyVal
        ,t1.secondvalue
    FROM t1
    INNER JOIN t2 ON t1.id = t2.id_fk
    ) t
INNER JOIN t3 ON t3.X = t.MyVal