我已使用此查询;
select nm.* from data nm , table (nm.class) a;
这里data
是我的主表,class
是我的嵌套表。但是sql语句不起作用。
答案 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