gpt4 book ai didi

sql - 选择带别名和不带-oracle 11g 有什么区别

转载 作者:行者123 更新时间:2023-12-03 14:48:03 26 4
gpt4 key购买 nike

我有一张 table ,让我们给它起个名字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
)

最佳答案

你必须这样做,因为那是 what the docs say ;)

2.1.8.1 When Table Aliases Are Required

Table aliases can be required to avoid problems resolving references.

Oracle Database requires you to use a table alias to qualify any dot-notational reference to subprograms or attributes of objects, to avoid inner capture and similar problems resolving references.



好的,那么为什么这个规则存在呢?

考虑这个场景:
create type emp_obj as object (
employee_id integer,
employee_name varchar2(100),
department_id integer
);
/

create table departments (
department_id integer,
manager emp_obj
);
/

create table manager (
employee_id integer,
employee_name varchar2(100),
department_id integer
);

select * from departments d
where exists (
select * from manager
where manager.department_id = d.department_id --which manager.department_id?
);

在这个例子中
  • departments table 上有一个 manager带有 department_id 的对象列属性
  • manager表有一列department_id

  • 那么 where manager.department_id有什么用决心?!

    在没有别名的情况下,它可以是任一表。当您存储对象时,可能有:
    <table_name>.<column_name>等同于 <object_column_name>.<attribute_name>来自同一查询中的另一个表!

    当您开始从表中添加/删除列或从类型中删除属性时,这会创建名称解析......惊喜。

    因此,为了避免这种情况,Oracle 数据库强制您必须使用别名。

    就像在查询中两次使用同一个表时需要使用别名一样:
    create table t (
    c1 int, c2 int
    );

    select * from t, t
    where c1 = 1;

    ORA-00918: column ambiguously defined

    select * from t t1, t t2
    where t1.c1 = 1;

    no rows selected

    请注意,对规则进行了改进:

    Use of a table alias is optional when referencing top-level attributes of an object table directly, without using the dot notation. For example, the following statements define two tables that contain the person_typ object type. person_obj_table is an object table for objects of type person_typ, and contacts is a relational table that contains a column of the object person_typ.



    创建对象表时,属性就是列。所以上面的歧义消失了。

    关于sql - 选择带别名和不带-oracle 11g 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59947296/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com