是否可以直接选择分层用户类型?
想象一下这样的表结构:
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
循环,这种方法是否可行?
答案 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;