繁体   English   中英

Oracle 虚拟列引用另一个表

[英]Oracle virtual column referencing another table

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

Oracle 关于虚拟列的文档非常清楚地说明了这一点,您只能引用同一张表中的列;

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

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

正如@JoeStefanelli 所说,做你想做的最好的选择是创建一个视图

在这种情况下, 创建视图可能是您最好的选择。

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

那不是答案。 这是为了防止您测试这个不起作用的想法:

我试图在一个函数内创建关节,并在虚拟列的定义中使用该函数。

CREATE TABLE A(
a1 integer,
a2 integer
);

CREATE TABLE B(
b1 integer,
b2 integer
);

CREATE FUNCTION f (arg IN integer)
    RETURN INTEGER
IS
  ret integer;
BEGIN
    select B.b2 into ret from A join B on A.a1=B.b1
    where A.a1=arg;
    RETURN ret;
END;

alter TABLE A add (
    a4 as (f(a1))
);

ORA-30553: 函数不确定

代码

但它不起作用。 您需要确定性函数。 (它不包括在数据库中使用查询的函数)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM