【问题标题】:Flattening data using PLSQL in Oracle 10G在 Oracle 10G 中使用 PLSQL 展平数据
【发布时间】:2013-02-04 23:32:09
【问题描述】:

有如下三个表:

Client (Client_Id)
Order (Order_Id, Client_Id)
OrderItem (OrderItem_Id, Order_Id)

如何获取ClientId 的列表以及客户端制作的所有 OrderItem_Id(序列化为字符串)的逗号分隔列表?

注意客户不能有多个订单。

这是一个例子:

输入:

Client: 100
Order: 50, 100
OrderItem: [{1, 50}, {2, 50}, {3, 50}]

预期结果:100, "1,2,3"

我使用的是 Oracle 10G(即将移至 11G),请不要使用 java,不要使用游标,不要使用临时表。

【问题讨论】:

    标签: plsql oracle10g


    【解决方案1】:

    WM_CONCAT if LIST_AGG 或可能XMLAGG

    Select client_ID, List_Agg(OrderItem_ID, ', ')
    from ORDER O
    INNER JOIN ORDERITEM OI on OI.Order_ID = O.Order_ID
    

    Select client_ID, wm_concat(OrderItem_ID)
    from ORDER O
    INNER JOIN ORDERITEM OI on OI.Order_ID = O.Order_ID
    

    注意:WM_CONCAT 是一个未记录的函数,使用风险自负;虽然非常有用。

    【讨论】:

    • 它们是互斥的 - 我可以将 WM_CONCAT 与 oracle 11G 一起使用吗?
    • WM_Concat 适用于 11g;再次是它的未记录/不受支持,因此 LIST_AGG 将在 11g 环境中更受青睐;但是,我理解需要在 10g 中编写代码并易于移植到 11g。只知道如果你使用 wm_concat,它会在某个时候中断; oracle 将告诉您使用 list_Agg。考虑到您当前的数据库版本困境,使用 XMLAgg 可能会更加痛苦。
    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多