Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在关系插入查询中引用嵌套表_Sql_Oracle_Nested Table - Fatal编程技术网

Sql 在关系插入查询中引用嵌套表

Sql 在关系插入查询中引用嵌套表,sql,oracle,nested-table,Sql,Oracle,Nested Table,下面是我拥有的对象类型。基本上,我有一个person表和一个子表作为person表的嵌套表 我有一个与子表(嵌套)具有M:N关系的学校表。所以我创建了一个中间表来插入child_学校数据 如何创建中间表并插入数据? create type school_t as object( sid number(5,2), name varchar(20)) / create type child_t as object( cid number(5,2), name va

下面是我拥有的对象类型。基本上,我有一个person表和一个子表作为person表的嵌套表

我有一个与子表(嵌套)具有M:N关系的学校表。所以我创建了一个中间表来插入child_学校数据

如何创建中间表并插入数据?

create type school_t as object(
    sid number(5,2),
    name varchar(20))
/

create type child_t as object(
    cid number(5,2),
    name varchar(20))
/

create type childtable_t as table of child_t
/

create type person_t as object(
    pid number(5,2),
    name varchar(20),
    child childtable_t)
/

create table person_tab of person_t(
    pid primary key
)nested table child store as child_table
/

create table school_tab of school_t
/
--有些问题。下面的代码不起作用

create type school_child_t as object(
    cid ref person_t,
    sid ref school_t)
/

create table school_child_tab of school_child_t(
    cid references person_tab,
    sid references school_tab
)
/
--这是我想做的
cid引用应该是嵌套表中的cid。问题是引用它。

我看到了您的编辑,我正要告诉您不可能从外部引用嵌套表

嵌套表在物理上创建为一个不同的表,该表与父表分开保存数据:

SQL> SELECT object_name, object_type
  2    FROM all_objects
  3   WHERE created > trunc(sysdate)
  4     AND object_type = 'TABLE';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
SCHOOL_TAB                     TABLE
CHILD_TABLE                    TABLE
PERSON_TAB                     TABLE
在这里,您可以看到Oracle已经创建了一个子_表,但是它对我们是隐藏的,并且只能由Oracle内部处理:

SQL> select * from child_table;

ORA-22812: cannot reference nested table column's storage table
在本例中,我非常确定您无法以任何方式引用子表,但令我惊讶的是,这似乎有效(我们无法从child_表中进行选择,但我们可以引用它):

您可以像这样构建插入(我真的不喜欢将数据存储为对象,但您可以这样做):


我看到了您的编辑,我正要告诉您,从外部引用嵌套表是不可能的

嵌套表在物理上创建为一个不同的表,该表与父表分开保存数据:

SQL> SELECT object_name, object_type
  2    FROM all_objects
  3   WHERE created > trunc(sysdate)
  4     AND object_type = 'TABLE';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
SCHOOL_TAB                     TABLE
CHILD_TABLE                    TABLE
PERSON_TAB                     TABLE
在这里,您可以看到Oracle已经创建了一个子_表,但是它对我们是隐藏的,并且只能由Oracle内部处理:

SQL> select * from child_table;

ORA-22812: cannot reference nested table column's storage table
在本例中,我非常确定您无法以任何方式引用子表,但令我惊讶的是,这似乎有效(我们无法从child_表中进行选择,但我们可以引用它):

您可以像这样构建插入(我真的不喜欢将数据存储为对象,但您可以这样做):


我已稍微更改了您的数据模型:

SQL> create type school_t as object(
  2      sid number(5,2),
  3      name varchar(20))
  4  /

Type created.

SQL> create type child_t as object(
  2      cid number(5,2),
  3      name varchar(20))
  4  /

Type created.

SQL> create table school_tab of school_t
  2  /

Table created.

SQL> create table child_tab  of child_t
  2  /

Table created.

SQL>
让我们填充嵌套表:

SQL> insert into child_tab
  2      values (111, 'Fred')
  3  /

1 row created.

SQL> insert into child_tab
  2      values (112, 'Ayesha')
  3  /

1 row created.

SQL> insert into child_tab
  2      values (113, 'Aadil')
  3  /

1 row created.

SQL> insert into school_tab
  2      values (222, 'Bash Street')
  3  /

1 row created.

SQL> insert into school_tab
  2      values (223, 'Greyfriars')
  3  /

1 row created.

SQL> 
这是一个嵌套表:

SQL> create type school_child_t as object(
  2      cid ref child_t,
  3      sid ref school_t)
  4  /

Type created.

SQL> create table school_child_tab of school_child_t
  2  /

Table created.

SQL>
我们按如下方式填充交集表:

SQL> insert into school_child_tab
  2        select cid, sid
  3        from
  4          ( select ref(c) as cid from child_tab c where c.cid = 111 )
  5          , ( select ref(s) as sid from school_tab s where s.sid = 222 )
  6  /

1 row created.

SQL> insert into school_child_tab
  2        select cid, sid
  3        from
  4          ( select ref(c) as cid from child_tab c where c.cid = 112 )
  5          , ( select ref(s) as sid from school_tab s where s.sid = 222 )
  6  /

1 row created.

SQL> insert into school_child_tab
  2        select cid, sid
  3        from
  4          ( select ref(c) as cid from child_tab c where c.cid = 113 )
  5          , ( select ref(s) as sid from school_tab s where s.sid = 222 )
  6  /

1 row created.

SQL> insert into school_child_tab
  2        select cid, sid
  3        from
  4          ( select ref(c) as cid from child_tab c where c.cid = 113 )
  5          , ( select ref(s) as sid from school_tab s where s.sid = 223 )
  6  /

1 row created.

SQL>
查询结果

SQL> select c.name as child_name
  2         , s.name as school_name
  3  from     school_child_tab sc
  4              join child_tab c
  5                  on ( ref(c) = sc.cid )
  6              join school_tab s
  7                  on ( ref(s) = sc.sid )
  8  /

CHILD_NAME           SCHOOL_NAME
-------------------- --------------------
Fred                 Bash Street
Ayesha               Bash Street
Aadil                Greyfriars
Aadil                Bash Street

SQL>

当然,这提出了一个问题:如果要使用对象的REF,是否需要ID列?当然,我认为将一个名为CID、类型为NUMBER的属性用于CHILD\u T类型和一个名称相同但数据类型为REF的属性用于SCHOOL\u CHILD\T类型是一种误导

我稍微更改了您的数据模型:

SQL> create type school_t as object(
  2      sid number(5,2),
  3      name varchar(20))
  4  /

Type created.

SQL> create type child_t as object(
  2      cid number(5,2),
  3      name varchar(20))
  4  /

Type created.

SQL> create table school_tab of school_t
  2  /

Table created.

SQL> create table child_tab  of child_t
  2  /

Table created.

SQL>
让我们填充嵌套表:

SQL> insert into child_tab
  2      values (111, 'Fred')
  3  /

1 row created.

SQL> insert into child_tab
  2      values (112, 'Ayesha')
  3  /

1 row created.

SQL> insert into child_tab
  2      values (113, 'Aadil')
  3  /

1 row created.

SQL> insert into school_tab
  2      values (222, 'Bash Street')
  3  /

1 row created.

SQL> insert into school_tab
  2      values (223, 'Greyfriars')
  3  /

1 row created.

SQL> 
这是一个嵌套表:

SQL> create type school_child_t as object(
  2      cid ref child_t,
  3      sid ref school_t)
  4  /

Type created.

SQL> create table school_child_tab of school_child_t
  2  /

Table created.

SQL>
我们按如下方式填充交集表:

SQL> insert into school_child_tab
  2        select cid, sid
  3        from
  4          ( select ref(c) as cid from child_tab c where c.cid = 111 )
  5          , ( select ref(s) as sid from school_tab s where s.sid = 222 )
  6  /

1 row created.

SQL> insert into school_child_tab
  2        select cid, sid
  3        from
  4          ( select ref(c) as cid from child_tab c where c.cid = 112 )
  5          , ( select ref(s) as sid from school_tab s where s.sid = 222 )
  6  /

1 row created.

SQL> insert into school_child_tab
  2        select cid, sid
  3        from
  4          ( select ref(c) as cid from child_tab c where c.cid = 113 )
  5          , ( select ref(s) as sid from school_tab s where s.sid = 222 )
  6  /

1 row created.

SQL> insert into school_child_tab
  2        select cid, sid
  3        from
  4          ( select ref(c) as cid from child_tab c where c.cid = 113 )
  5          , ( select ref(s) as sid from school_tab s where s.sid = 223 )
  6  /

1 row created.

SQL>
查询结果

SQL> select c.name as child_name
  2         , s.name as school_name
  3  from     school_child_tab sc
  4              join child_tab c
  5                  on ( ref(c) = sc.cid )
  6              join school_tab s
  7                  on ( ref(s) = sc.sid )
  8  /

CHILD_NAME           SCHOOL_NAME
-------------------- --------------------
Fred                 Bash Street
Ayesha               Bash Street
Aadil                Greyfriars
Aadil                Bash Street

SQL>


当然,这提出了一个问题:如果要使用对象的REF,是否需要ID列?当然,我认为将一个名为CID、类型为NUMBER的属性用于CHILD\u T类型和一个名称相同但数据类型为REF的属性用于SCHOOL\u CHILD\T类型是一种误导

+1在大学作业之外,有人在数据库表中使用过嵌套表吗?@Vincent:我想引用嵌套表中的子对象中的cid。不是pid本人_t@TonyAndrews-我遇到过它们的真正用途,如果高度专业化的话。OracleSpatial使用嵌套表,这些表指向实现可能有效的场景。但我同意大多数例子——像这样——都是假的,最好作为普通表来实现。@Nipuna:您可以引用嵌套表,请参阅我的更新版answer@Vincent例如我得到了答案。感谢+1除了大学作业之外,有人在数据库表中使用过嵌套表吗?@Vincent:我想引用嵌套表中的child\t对象中的cid。不是pid本人_t@TonyAndrews-我遇到过它们的真正用途,如果高度专业化的话。OracleSpatial使用嵌套表,这些表指向实现可能有效的场景。但我同意大多数例子——像这样——都是假的,最好作为普通表来实现。@Nipuna:您可以引用嵌套表,请参阅我的更新版answer@Vincent例如我得到了答案。谢谢为什么一个人有一个嵌套的CHILDTABLE\T表?事实上,您的整体数据模型似乎有点混乱。也许你应该解释一下你想建模什么,而不是要求我们解释你的代码?@APC:这是我试图将弱实体理解为实体表,并从外部引用它。我添加了一个图像,这样你可以理解。但是为什么一个人可以有很多孩子呢?如果CHILD是PERSON的一个子类型,那么这是1:1关系,而不是!:若这个人的意思像老师或家长,那个么你们的模式在其他方面是错误的。是的,我认为你们是正确的。应该是1:1。谢谢为什么PERSON有一个嵌套的CHILDTABLE\T表?事实上,您的整体数据模型似乎有点混乱。也许你应该解释一下你想建模什么,而不是要求我们解释你的代码?@APC:这是我试图将弱实体理解为实体表,并从外部引用它。我添加了一个图像,这样你可以理解。但是为什么一个人可以有很多孩子呢?如果CHILD是PERSON的一个子类型,那么这是1:1关系,而不是!:若这个人的意思像老师或家长,那个么你们的模式在其他方面是错误的。是的,我认为你们是正确的。应该是1:1。谢谢谢谢,但我想从外部查询中引用嵌套表。我从Vincent上次编辑中得到了我想要的。谢谢,但我想从外部查询中引用嵌套表。我从文森特上次编辑中得到了我想要的。