Sql 直接选择到分层用户类型

Sql 直接选择到分层用户类型,sql,oracle,plsql,user-defined-types,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 repla

是否可以直接在分层用户类型中进行选择

想象一下这样的表结构:

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
------
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
------
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循环,这是可能的吗?

使用CASTMULTISET:

您可以使用:

这将返回可以批量收集到父\u表中的父\u项列表

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

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)

谢谢,到目前为止看起来很棒。但它不会产生parent_table类型的对象。我该怎么做?我假设我需要以某种方式将完整的结果强制转换为parent_表,并将其选择到该类型的变量中,但我不完全确定这种转换是什么样的。也许是这样的?选择castmultiset选择p.id、p.name、castmultiset。。。作为子_表作为父_表从dualThank变为变量!然而,我接受了Vincent的解决方案,因为它允许我将已经存在的语句用于连接。谢谢您的回答。假设父项中有3个项,并且每个项在子项中都有三个相关项。这将返回3个父项和3个子项,还是返回9个父项和1个子项?我这样问是因为我在问题中的示例查询的结果是9行。回答我自己的问题:它返回3个父母,每个人有3个孩子。回答得很好-我对这个问题的直接反应是它无法完成,但幸运的是我得到了纠正,今天学到了一些东西。