使用Oracle生成XML
我正在尝试从oracle创建一个XML,它在它们之间具有父子关系 表中的数据如下所示。在这里,一名员工可以链接到一名或多名经理。 这里,empID 101链接到3管理器100102104 最后的XML应该是这样的使用Oracle生成XML,xml,oracle,Xml,Oracle,我正在尝试从oracle创建一个XML,它在它们之间具有父子关系 表中的数据如下所示。在这里,一名员工可以链接到一名或多名经理。 这里,empID 101链接到3管理器100102104 最后的XML应该是这样的 <view_hierarchy chm="com.hierarchy"> <link> <parentID ID="100"> <contains> <child ID="101"/&
<view_hierarchy chm="com.hierarchy">
<link>
<parentID ID="100">
<contains>
<child ID="101"/>
<containby>
<parentID ID="102"/>
<parentID ID="104"/>
</containby>
</contains>
<contains>
<child ID="105"/>
</contains>
</parentID>
</link>
</view_hierarchy>
我想,这就是你想要的:
with employees as(
select 101 Employee_ID , 100 Manager_ID from dual
union all
select 105 Employee_ID , 100 Manager_ID from dual
union all
select 101 Employee_ID , 102 Manager_ID from dual
union all
select 101 Employee_ID , 104 Manager_ID from dual
)
SELECT XMLElement (
"view_hierarchy",
XMLATTRIBUTES('com.hierarchy.mdm'as "chm"),
XMLElement ("link", XMLAgg(
XMLElement("parentID",
XMLAttributes(e1.manager_id as "GTIN"),
XMLElement ("contains",XMLAgg
(
XMLELEMENT (
"child",
XMLAttributes(e1.employee_id as "GTIN"), e2.x
))
)
)))
) ||''
FROM employees e1
left join (select
XMLElement ("containby" , XMLAgg(XMLElement("parentID", XMLAttributes
(e2.manager_id as "GTIN" ) )
) )
x, employee_id from employees e2
where e2.manager_id !=100
group by e2.employee_id) e2 on e2.employee_id=e1.employee_id
where e1.manager_id=100
group by e1.manager_id
这应该可以解决问题
SELECT XMLELEMENT (
"view_hierarchy",
XMLATTRIBUTES ('com.hierarchy.mdm' AS "chm"),
XMLELEMENT (
"link",
XMLELEMENT (
"PARENT_ID",
XMLAttributes (manager_id AS "GTIN"),
XMLELEMENT (
"contains",
XMLAGG(XMLELEMENT (
"child",
XMLAttributes (emp.employee_id AS "GTIN"),
XMLELEMENT (
"contained_by",
(SELECT XMLAGG(XMLELEMENT (
"parent_id",
xmlattributes (
emp_p.manager_id AS "GTIN")))
FROM employees emp_p
WHERE emp_p.manager_id <> emp.manager_id
AND emp.employee_id =
emp_p.employee_id))))))))
|| ' '
FROM employees emp
WHERE emp.manager_id = 100
GROUP BY emp.manager_id
我认为,您的数据是错误的,雇员101有3个经理。它可以有多个经理。containby part中也必须反映出这一点,在containby part中,它将显示除列出它的管理器之外的所有管理器。因此,主管理器是谁,还是随机的?主管理器强烈反对在语句的select部分使用子select。这可能会破坏您的性能。一个子选择是不必要的,我删除了,因为我认为xml的结构不好,但要实现xml,我认为这个查询是简单且更容易理解的。
with employees as(
select 101 Employee_ID , 100 Manager_ID from dual
union all
select 105 Employee_ID , 100 Manager_ID from dual
union all
select 101 Employee_ID , 102 Manager_ID from dual
union all
select 101 Employee_ID , 104 Manager_ID from dual
)
SELECT XMLElement (
"view_hierarchy",
XMLATTRIBUTES('com.hierarchy.mdm'as "chm"),
XMLElement ("link", XMLAgg(
XMLElement("parentID",
XMLAttributes(e1.manager_id as "GTIN"),
XMLElement ("contains",XMLAgg
(
XMLELEMENT (
"child",
XMLAttributes(e1.employee_id as "GTIN"), e2.x
))
)
)))
) ||''
FROM employees e1
left join (select
XMLElement ("containby" , XMLAgg(XMLElement("parentID", XMLAttributes
(e2.manager_id as "GTIN" ) )
) )
x, employee_id from employees e2
where e2.manager_id !=100
group by e2.employee_id) e2 on e2.employee_id=e1.employee_id
where e1.manager_id=100
group by e1.manager_id
SELECT XMLELEMENT (
"view_hierarchy",
XMLATTRIBUTES ('com.hierarchy.mdm' AS "chm"),
XMLELEMENT (
"link",
XMLELEMENT (
"PARENT_ID",
XMLAttributes (manager_id AS "GTIN"),
XMLELEMENT (
"contains",
XMLAGG(XMLELEMENT (
"child",
XMLAttributes (emp.employee_id AS "GTIN"),
XMLELEMENT (
"contained_by",
(SELECT XMLAGG(XMLELEMENT (
"parent_id",
xmlattributes (
emp_p.manager_id AS "GTIN")))
FROM employees emp_p
WHERE emp_p.manager_id <> emp.manager_id
AND emp.employee_id =
emp_p.employee_id))))))))
|| ' '
FROM employees emp
WHERE emp.manager_id = 100
GROUP BY emp.manager_id