直接选择分层用户类型

时间:2012-05-09 11:55:57

标签: sql oracle plsql user-defined-types

是否可以直接选择分层用户类型?

想象一下这样的表结构:

PARENT
------
ID
NAME

CHILD
-----
ID
PARENT_ID
NAME

此外,我有这样的用户类型:

create or replace type child_item as object
(
  ID NUMBER(10),
  NAME VARCHAR(255)
);

create or replace type children_table as table of child_item;

create or replace type parent_item as object
(
  ID NUMBER(10),
  NAME VARCHAR(255),
  CHILDREN CHILDREN_TABLE
);

create or replace type parent_table as table of parent_item;

这样的陈述:

select * from parent p inner join child c on p.id = c.parent_id;

现在,我希望该语句的结果位于parent_table类型的对象中。如果不使用复杂的FOR循环,这种方法是否可行?

2 个答案:

答案 0 :(得分:4)

您可以使用COLLECT

SELECT parent_item(p.ID, 
                   p.NAME, 
                   CAST(COLLECT(child_item(c.id, c.NAME)) AS children_table))
  FROM PARENT p
 INNER JOIN child c ON p.id = c.parent_id
 GROUP BY p.ID, p.NAME

这会返回PARENT_ITEM的列表,您可以将其收集到PARENT_TABLE中。

您可以在外部查询中再次使用COLLECT直接获取PARENT_TABLE:

SELECT CAST(COLLECT(parents) AS parent_table)
  FROM (SELECT parent_item(p.ID, 
                           p.NAME, 
                           CAST(COLLECT(child_item(c.id, c.NAME)) 
                             AS children_table)
                          ) parents
          FROM PARENT p
         INNER JOIN child c ON p.id = c.parent_id
         GROUP BY p.ID, p.NAME)

答案 1 :(得分:1)

使用CAST(MULTISET())

with data as (
select p.id pid,p.name pname,cast(multiset(select c.id,c.name 
from child c where c.parent_id=p.id) AS children_table) ct
from parent p
)
select cast(multiset(select pid,pname,ct from data) as parent_table) 
from dual;