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

我试图理解,在不同的地方使用子查询时,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语句中可用,结果为

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