XMLType: group by select 查询

XMLType: group by select query

我在 Oracle 12c 中有这个基于 XML 的查询:

  SELECT XMLELEMENT (
            "companiesArray",
            XMLAGG (
               XMLELEMENT (
                  "CompanyElement",
                  XMLFOREST (d.poclcdde AS "companyCode"),
                  (SELECT XMLELEMENT (
                             "policiesArray",
                             XMLAGG (
                                XMLELEMENT (
                                   "PolicyElement",
                                   XMLELEMENT ("policyNumber", de.polinpol),
                                   XMLELEMENT ("companyCode", de.policdde),
                                   XMLELEMENT ("productCode", de.politipo))))
                     FROM dtpoli de
                    WHERE de.polinpol = d.poclnpol AND de.policdde = d.poclcdde))))
    FROM dtpocl d
   WHERE d.poclcdcl = 202126

我得到这个结果:

<companiesArray>
    <CompanyElement>
        <companyCode>100</companyCode>
        <policiesArray>
            <PolicyElement>
                <policyNumber>1000005</policyNumber>
                <companyCode>100</companyCode>
                <productCode>02</productCode>
            </PolicyElement>
        </policiesArray>
    </CompanyElement>
    <CompanyElement>
        <companyCode>100</companyCode>
        <policiesArray>
            <PolicyElement>
                <policyNumber>9902658</policyNumber>
                <companyCode>100</companyCode>
                <productCode>02</productCode>
            </PolicyElement>
        </policiesArray>
    </CompanyElement>
    <CompanyElement>
        <companyCode>200</companyCode>
        <policiesArray>
            <PolicyElement>
                <policyNumber>1000005</policyNumber>
                <companyCode>200</companyCode>
                <productCode>02</productCode>
            </PolicyElement>
        </policiesArray>
    </CompanyElement>
</companiesArray>

但我想按 companyCode (d.poclcdde) 对结果进行分组。像这样:

<companiesArray>
    <CompanyElement>
        <companyCode>100</companyCode>
        <policiesArray>
            <PolicyElement>
                <policyNumber>1000005</policyNumber>
                <companyCode>100</companyCode>
                <productCode>02</productCode>
            </PolicyElement>
            <PolicyElement>
                <policyNumber>9902658</policyNumber>
                <companyCode>100</companyCode>
                <productCode>02</productCode>
            </PolicyElement>
        </policiesArray>
    </CompanyElement>
    <CompanyElement>
        <companyCode>200</companyCode>
        <policiesArray>
            <PolicyElement>
                <policyNumber>1000005</policyNumber>
                <companyCode>200</companyCode>
                <productCode>02</productCode>
            </PolicyElement>
        </policiesArray>
    </CompanyElement>
</companiesArray>

我尝试了一些方法但没有成功。如果我放置 GROUP BY d.poclcdde,我会得到两个具有相同 XML 结构的不同记录,但按公司代码分开。 我想我快接近了,但我想念 "near"。 :) 注意:我不想在 Oracle 12c 中使用已弃用的代码 非常感谢

我找到了解决方案:

SELECT XMLELEMENT (
          "CompanyArray",
          (  SELECT XMLAGG (
                       XMLELEMENT (
                          "CompanyElement",
                          XMLELEMENT ("companyCode", m.poclcdde),
                          XMLAGG (
                             XMLELEMENT (
                                "PolicyElement",
                                XMLFOREST (s.polinpol AS "policyNumber",
                                           s.politipo AS "productCode")))))
                       xml_payload
               FROM dtpocl m, dtpoli s
              WHERE     m.poclcdde = s.policdde
                    AND m.poclnpol = s.polinpol
                    AND m.poclcdcl = 202126
           GROUP BY m.poclcdde))
  FROM DUAL;

只需连接两个表并保留在 CompanyArray 元素之外。 简单(如我所想)。

谢谢!