【问题标题】:Oracle virtual column referencing another tableOracle 虚拟列引用另一个表
【发布时间】:2012-09-28 15:34:18
【问题描述】:

我有一个表 TABLE1 与列 COL_TAB1

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

另一个表TABLE2COL_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

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    Oracle 的documentation on virtual columns 说的很清楚,你只能引用同一个表中的列;

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

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

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 这是有道理的,但在一个稍微相关的问题上,你知道 hibernate 是否像处理表一样处理视图?
      • @jidma:对不起,我没有用过hibernate,所以我不能说。
      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多