我有一个表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
答案 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