SQL,子查询中列的范围
我试图理解,在不同的地方使用子查询时,SQL中特定列的范围是什么。比如说SQL,子查询中列的范围,sql,oracle,Sql,Oracle,我试图理解,在不同的地方使用子查询时,SQL中特定列的范围是什么。比如说 select (case(val) when 1 then 'one' when 2 then 'two' else 'something else' end) as description, val from (select 1 as val from dual); 通过此查询,val在select语句中可用,结果为 De
select (case(val)
when 1 then 'one'
when 2 then 'two'
else 'something else'
end) as description, val
from (select 1 as val from dual);
通过此查询,val在select语句中可用,结果为
Description | Val
-------------------
one | 1
但是下面的问题
select (case(val)
when 1 then 'one'
when 2 then 'two'
else 'something else'
end) as description,
(select 1 from dual) as val
from dual;
出现以下错误(在Oracle中)
为什么val在后一个示例中不可用,这背后的技术原因是什么?这是一个有点长的注释 当然,此查询中会出现错误:
select (case val when 1 then 'one' when 2 then 'two' else 'something else' end) as description,
(select 1 from dual) as val
from dual;
第一个表达式中的val
来自何处?当然不是从dual
通常,您不能在定义列别名的同一select
中(也不能在where
或group by
中)引用列别名
我发现这很不寻常,因为您在引用它之后定义了val
。在我看来,这应该使val
没有定义这一点更加明显。但是,顺序并不重要。无论定义在何处,都不能引用val
您似乎理解了修复方法,即使用子查询或CTE来定义值。好的,在第二个查询中,
val
不再是列名或别名,而是一个表别名,如下面的代码行所示。那么,您希望如何在CASE
表达式中使用它呢
(select 1 from dual) as val
(select 1 from dual) as val