我有一张桌子,我们命名为table1
。
表由许多列组成,其中一列是一个对象,由3个子列组成,我们称它们为value1
,value2
,value3
。
假设对象类型命名为object_type1
。
我准备了一个投影查询,看起来像这样:
Select typed_column.value1
from table1
此预测在Oracle 11g上不起作用,它说'无效标识符'。
所以我试图将表的名称添加到所选列:
Select table1.typed_column.value1
from table1
也没有用。
但是当我使用别名时:
Select tab1.typed_column.value1
from table1 tab1
正在运行。
我还发现了另一个可行的解决方案(使用treat函数):
Select treat(typed_column as object_type1).value1
from table1
我的问题是:别名实际上是什么,数据库实际上知道如何映射对象类型的列?
为什么我的前两个查询无法正常工作?
我准备了一个表和类型,表的DDL看起来像:
CREATE TABLE table1
(
--....lot of other columns before
typed_column OBJECT_TYPE_1
)
和对象的DDL:
CREATE OR REPLACE TYPE "MY_SCHEMA"."OBJECT_TYPE_1" is object
(
value1 varchar2(100),
value2 date,
value3 date
)
您不应在查询的两边都引用该表。如果要从表A中选择数据,请不要选择A.B.C。只需从A]中选择B.C