3

階層型のユーザー タイプを直接選択することはできますか?

次のようなテーブル構造を想像してください。

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;

ここで、そのステートメントの結果を type のオブジェクトにしたいと考えていますparent_tableFORこれは、複雑なループを使用せずに何とか可能ですか?

4

2 に答える 2

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これにより、BULKCOLLECTできるリストが返されます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)
于 2012-05-09T13:03:22.357 に答える
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;
于 2012-05-09T12:43:29.917 に答える