如何描述嵌套表的结构?

时间:2018-07-26 10:06:26

标签: oracle

我已使用此查询;

select nm.* from data nm , table (nm.class) a;

这里data是我的主表,class是我的嵌套表。但是sql语句不起作用。

1 个答案:

答案 0 :(得分:1)

您正在做的事情很有效,

create type my_nt_type as table of number
/

create table data (id number, class my_nt_type)
nested table class store as class_nt
/

insert into data values (1, my_nt_type(1, 2, 3, 4));

select nm.* from data nm , table (nm.class) a;

        ID CLASS                         
---------- ------------------------------
         1 MY_NT_TYPE(1, 2, 3, 4)        
         1 MY_NT_TYPE(1, 2, 3, 4)        
         1 MY_NT_TYPE(1, 2, 3, 4)        
         1 MY_NT_TYPE(1, 2, 3, 4)        

您正在将data表与来自table()的表表达式交叉连接(但使用旧语法),但是您仅引用选择列表中原始的data表列; nm.*意味着您可以看到data中的所有列,包括您的客户选择显示嵌套表的情况,每一行都重复了该行的嵌套表中有多少元素。

通过指定data中的非NT列,再加上爆炸式嵌套表中的列(或者比它的对象复杂的字段,如果比我的例子更复杂的话),您可以获得更有用的结果:

select nm.id, a.column_value as from_class
from data nm
cross join table (nm.class) a;

        ID FROM_CLASS
---------- ----------
         1          1
         1          2
         1          3
         1          4

使用对象表只是稍微复杂一点,因为您需要列出所有想要的字段:

create type my_obj_type as object (field1 number, field2 varchar2(10))
/

create type my_nt_type as table of my_obj_type
/

create table data (id number, class my_nt_type)
nested table class store as class_nt
/

insert into data values (1, my_nt_type(my_obj_type(1, 'One'), my_obj_type(2, 'Two')));
insert into data values (2, my_nt_type(my_obj_type(3, 'Three'), my_obj_type(4, 'Four'),
  my_obj_type(5, 'Five')));

select nm.id, a.field1, a.field2
from data nm
cross join table (nm.class) a;

        ID     FIELD1 FIELD2    
---------- ---------- ----------
         1          1 One       
         1          2 Two       
         2          3 Three     
         2          4 Four      
         2          5 Five