Oracle XML ORA-00978:不带分组依据的嵌套分组函数
我试图使用Oracle的XML函数生成XML,但我一直得到ORA-00978:nested group函数,而没有group BY错误消息 我对XML和Oracle的XML函数都是新手,所以我似乎遗漏了一些主要的东西。然而,当我在线查看示例时,我无法理解我做错了什么 SQL: 期望输出:Oracle XML ORA-00978:不带分组依据的嵌套分组函数,oracle,Oracle,我试图使用Oracle的XML函数生成XML,但我一直得到ORA-00978:nested group函数,而没有group BY错误消息 我对XML和Oracle的XML函数都是新手,所以我似乎遗漏了一些主要的东西。然而,当我在线查看示例时,我无法理解我做错了什么 SQL: 期望输出: <apiRequest> <orders> <order> <no>1</no> <date>04/0
<apiRequest>
<orders>
<order>
<no>1</no>
<date>04/03/2010</date>
<orderItems>
<orderItem>
<position>1</position>
</orderItem>
<orderItem>
<position>2</position>
</orderItem>
<orderItem>
<position>3</position>
</orderItem>
<orderItem>
<position>4</position>
</orderItem>
</orderItems>
</order>
<order>
<no>2</no>
<date>04/03/2010</date>
<orderItems>
<orderItem>
<position>1</position>
</orderItem>
<orderItem>
<position>2</position>
</orderItem>
<orderItem>
<position>3</position>
</orderItem>
<orderItem>
<position>4</position>
</orderItem>
</orderItems>
</order>
</orders>
</apiRequest>
您可以在子查询中放置第二个xmlagg,它将给出所需的结果:
select
xmlelement("apiRequest",
xmlelement("orders",
xmlagg(
xmlelement("order",
xmlelement("no", orders.order_no),
xmlelement("date", orders.order_date),
xmlelement("orderItems",
(select xmlagg(
xmlelement("orderItem",
xmlelement("position", order_items.item_position)
)
)
from order_items where order_no = orders.order_no)
))))) as xml
from orders
执行嵌套聚合时,需要一个GROUPBY子句。聚合的第一个级别是分组级别,然后再次聚合该级别的结果 为了举例说明,我使用了Oracle提供的OE模式中的ORDERS和ORDER_ITEMS表
select
xmlelement("apiRequest",
xmlelement("orders",
xmlagg(
xmlelement("order",
xmlelement("no", order_id),
xmlelement("date", oe.orders.order_date),
xmlelement("orderItems",
xmlagg(
xmlelement("orderItem",
xmlelement("position", oe.order_items.line_item_id)
)
)
)
)
)
)
)
as xml
from oe.orders join oe.order_items using(order_id)
group by order_id, order_date;
另一个答案使用标量子查询,在本例中我将避免使用标量子查询,因为它对每个顺序执行一个递归SQL,而不是简单地联接
select
xmlelement("apiRequest",
xmlelement("orders",
xmlagg(
xmlelement("order",
xmlelement("no", order_id),
xmlelement("date", oe.orders.order_date),
xmlelement("orderItems",
xmlagg(
xmlelement("orderItem",
xmlelement("position", oe.order_items.line_item_id)
)
)
)
)
)
)
)
as xml
from oe.orders join oe.order_items using(order_id)
group by order_id, order_date;