我有类似的东西(伪代码):
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的简单方法?
答案 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语句的范围内。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