2017-06-21 70 views
2

我想了解,在不同地方使用子查詢時,SQL中特定列的範圍是什麼。例如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)

00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 
Error at Line: 263 Column: 14 

爲什麼val在後面的例子中不可用,這背後的技術原因是什麼?

回答

3

這是有點長的評論。

當然,你在這個查詢得到一個錯誤:

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(或wheregroup by)中引用列別名。

我覺得這很不尋常,因爲你在之後提到val。在我看來,這應該更明顯的是val沒有定義。但是,排序並不重要。無論在何處定義,您都不能參考val

您似乎理解修復,即使用子查詢或CTE來定義值。

0

那麼,在你的第二個查詢val不再是一個列名或別名,而是一個表的別名,如下面的代碼行所示。那麼你如何期待在CASE表達式中使用?

(select 1 from dual) as val