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
元素之外。
简单(如我所想)。
谢谢!
我在 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
元素之外。
简单(如我所想)。
谢谢!