Puoi tornare dal fratello dello studente s_days
nodo:
select h.PlanCodeCode, b.amount, b.pcode, b.child1_amount, b.child2_amount
from t
cross join
xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
'/SSO_XML'
passing t.xml
columns PlanCodeCode varchar2(100) path './PlanCode/@PlanCodeCode',
attributes xmltype path './PlanCode'
) h
left join xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
'PlanCode/S_DAYS/STUDENT/DIVISION'
passing h.attributes
columns node_level for ordinality
, amount number path '@Amount'
, pcode varchar2(10) path './../../@PCODE'
, child1_amount number path './../../../S_DAYS[@PCODE="Child1"]/AdditonalFare/AdditonalFareAmount/@Amount'
, child2_amount number path './../../../S_DAYS[@PCODE="Child2"]/AdditonalFare/AdditonalFareAmount/@Amount'
) b on 1=1;
Oppure puoi prendere i bambini dalla prima tabella XML, se vuoi vederli sempre anche se non ci sono nodi studente:
select h.PlanCodeCode, b.amount, b.pcode, h.child1_amount, h.child2_amount
from t
cross join
xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
'/SSO_XML'
passing t.xml
columns PlanCodeCode varchar2(100) path './PlanCode/@PlanCodeCode',
attributes xmltype path './PlanCode',
child1_amount number path './PlanCode/S_DAYS[@PCODE="Child1"]/AdditonalFare/AdditonalFareAmount/@Amount',
child2_amount number path './PlanCode/S_DAYS[@PCODE="Child2"]/AdditonalFare/AdditonalFareAmount/@Amount'
) h
left join xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
'PlanCode/S_DAYS/STUDENT/DIVISION'
passing h.attributes
columns node_level for ordinality
, amount number path '@Amount'
, pcode varchar2(10) path './../../@PCODE'
) b on 1=1;
Per inciso, dato che sei su 12c puoi usare cross apply
e outer apply
- quest'ultimo al posto dell'outer join con dummy on 1=1
condizione.
select h.PlanCodeCode, b.amount, b.pcode, h.child1_amount, h.child2_amount
from t
cross apply
xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
'/SSO_XML'
passing t.xml
columns PlanCodeCode varchar2(100) path './PlanCode/@PlanCodeCode',
attributes xmltype path './PlanCode',
child1_amount number path './PlanCode/S_DAYS[@PCODE="Child1"]/AdditonalFare/AdditonalFareAmount/@Amount',
child2_amount number path './PlanCode/S_DAYS[@PCODE="Child2"]/AdditonalFare/AdditonalFareAmount/@Amount'
) h
outer apply xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
'PlanCode/S_DAYS/STUDENT/DIVISION'
passing h.attributes
columns node_level for ordinality
, amount number path '@Amount'
, pcode varchar2(10) path './../../@PCODE'
) b;
Ognuno di questi ottiene lo stesso risultato con i tuoi dati di esempio:
PLANCODECODE | AMOUNT | PCODE | CHILD1_AMOUNT | CHILD2_AMOUNT
:----------- | -----: | :---- | ------------: | ------------:
CHOICE | 150.05 | P123 | 100 | 130
CHOICE | 250.05 | P123 | 100 | 130
CHOICE | 150.05 | P1234 | 100 | 130
CHOICE | 250.05 | P1234 | 100 | 130