Oracle虚拟列引用另一个表

时间:2012-09-28 15:34:19

标签: sql oracle oracle11g

我有一个表TABLE1,其中包含COL_TAB1列。

select * from TABLE1:
 COL_TAB1
|    1   |
|    2   |
|    3   |

使用TABLE2的另一个表格COL_TAB2并引用第一列COL_TAB1

select * from TABLE2:
 COL_TAB2  |  COL_TAB1
| val1     |     1
| val2     |     2
| val2     |     3

是否可以在table1上添加虚拟列,以便获得与以下查询相同的结果:

select 
    t1.COL_TAB1, 
    (select t2.COL_TAB2 from TABLE2 t2 where t2.COL_TAB1 = t1.COL_TAB1)
from TABLE1 t1

我试过了:

alter table TABLE1 add (
    SOME_COL_NAME as (select t2.COL_TAB2 from TABLE2 t2 where t2.COL_TAB1 = COL_TAB1)
)

但它给了我ORA-00936: missing expression

2 个答案:

答案 0 :(得分:10)

Oracle的documentation on virtual columns相当清楚地说明了,你只能引用同一个表中的列;

  

虚拟列定义中使用的表达式具有以下内容   限制:

     
      
  • 它不能按名称引用另一个虚拟列。
  •   
  • 它只能引用同一个表中定义的列。
  •   
  • 如果是指a   确定性的用户定义函数,它不能用作   分区键列。
  •   
  • 表达式的输出必须是a   标量值。它无法返回Oracle提供的数据类型,a   用户定义的类型,或LOB或LONG RAW。
  •   

正如@JoeStefanelli所说,做你想做的最好的选择是create a view

答案 1 :(得分:2)

在这种情况下,

Creating a view可能是你最好的选择。

CREATE VIEW vwTable1and2
AS
    SELECT t1.COL_TAB1, t2.COL_TAB2
        FROM TABLE1 t1
            INNER JOIN TABLE2 t2
                ON t1.COL_TAB1 = t2.COL_TAB1