【问题标题】:Select directly into hierarchical user type直接选择成分层用户类型
【发布时间】:2012-05-17 22:31:47
【问题描述】:

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

想象一下这样的表结构:

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

【问题讨论】:

    标签: sql oracle plsql user-defined-types


    【解决方案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;
    

    【讨论】:

    • 谢谢,到目前为止看起来很棒。但它不会产生parent_table 类型的对象。我该怎么做?我假设我需要以某种方式将完整的结果转换为 parent_table 并将其选择为该类型的变量,但我不完全确定这种转换的样子。也许是这样的? select cast(multiset(select p.id, p.name, cast(multiset(...) as children_table)) as parent_table) into variable from dual
    • 谢谢!但是,我接受了 Vincent 的解决方案,因为它允许我将我已经存在的语句与连接一起使用。
    【解决方案2】:

    你可以使用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)
    

    【讨论】:

    • 感谢您的回答。假设PARENT 中有 3 个项目,每个项目在 CHILDREN 中都有三个相关项目。这将返回 3 parent_items 和 3 child_items 还是返回 9 parent_items 和 1 child_item?我在问,因为我在问题中的示例查询的结果将是 9 行。
    • 回答我自己的问题:它返回 3 个父母,每个父母有 3 个孩子。
    • 很好的答案 - 我对这个问题的直接反应是它无法完成,但幸运的是我得到了纠正并且今天学到了一些东西。
    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 2020-12-29
    • 2012-02-07
    • 2016-02-09
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多