2016-07-12 3 views
0

У меня есть этот XML на основе запросов в Oracle 12c:XMLType: группа по выберите запрос

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 (д .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, но разделить на companyCode. Я думаю, что я почти близко, но я скучаю по «ближнему». :) Примечание: Я не хочу, чтобы использовать устаревший код в Oracle 12c Большое спасибо

ответ

0

Я нашел решение для этого:

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 элемент. Простой (как я и думал).

Спасибо!

Смежные вопросы