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个孩子。回答得很好-我对这个问题的直接反应是它无法完成,但幸运的是我得到了纠正,今天学到了一些东西。