Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle XML ORA-00978:不带分组依据的嵌套分组函数_Oracle - Fatal编程技术网

Oracle XML ORA-00978:不带分组依据的嵌套分组函数

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

我试图使用Oracle的XML函数生成XML,但我一直得到ORA-00978:nested group函数,而没有group BY错误消息

我对XML和Oracle的XML函数都是新手,所以我似乎遗漏了一些主要的东西。然而,当我在线查看示例时,我无法理解我做错了什么

SQL:

期望输出:

<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;