在XMLELEMENT XMLFOREST中使用LISTAGG
想象两个表站点和建筑物,其中一个站点可能有多个建筑物。我有一个查询,它生成了一个用于地理空间数据映射的xml,并尝试添加属于某个站点的所有建筑,我想使用listag函数 添加建筑之前的工作查询在XMLELEMENT XMLFOREST中使用LISTAGG,xml,oracle,oracle11g,Xml,Oracle,Oracle11g,想象两个表站点和建筑物,其中一个站点可能有多个建筑物。我有一个查询,它生成了一个用于地理空间数据映射的xml,并尝试添加属于某个站点的所有建筑,我想使用listag函数 添加建筑之前的工作查询 SELECT XMLELEMENT("rss", XMLATTRIBUTES('http://www.georss.org/georss' AS "xmlns:georss"), XMLELEMENT("channel",
SELECT XMLELEMENT("rss",
XMLATTRIBUTES('http://www.georss.org/georss' AS "xmlns:georss"),
XMLELEMENT("channel",
XMLAGG(XMLELEMENT("item",
XMLFOREST(title AS "title",
description AS "description",
point AS "georss:point"))))).EXTRACT('/*')
FROM (SELECT trim(s.sitedesc) AS title,
'Employee Count: ' || s.sitefte || '. Bldg Gross SF: ' || s.bldgarea || '. ' || CASE WHEN s.leasestat = '0' THEN 'Owned' WHEN s.leasestat = '1' THEN 'Leased, end date: ' || trim(l.edate) END AS description,
trim(s.latitude) || ' ' || trim(s.longitude) AS point
FROM site s, leases l
WHERE s.sold <> 1
AND s.longitude != ' '
AND s.sitecode = l.sitecode
)
然而,GROUPBY子句在xml中抛出了一个错误,而不是我期望的GROUPBY表达式,但似乎无法修复。下面的示例,是否可以在XMLELEMENT中使用LISTAGG
SELECT XMLELEMENT("rss",
XMLATTRIBUTES('http://www.georss.org/georss' AS "xmlns:georss"),
XMLELEMENT("channel",
XMLAGG(XMLELEMENT("item",
XMLFOREST(title AS "title",
description AS "description",
point AS "georss:point"))))).EXTRACT('/*')
FROM (SELECT trim(s.sitedesc) AS title,
'Employee Count: ' || s.sitefte || '. Bldg Gross SF: ' || s.bldgarea || '. ' || CASE WHEN s.leasestat = '0' THEN 'Owned' WHEN s.leasestat = '1' THEN 'Leased, end date: ' || trim(l.edate) END || LISTAGG(trim(b.bldgcode)||' '||trim(b.bldgdesc), ', ') WITHIN GROUP (ORDER BY b.bldgcode) AS description,
trim(s.latitude) || ' ' || trim(s.longitude) AS point
FROM site s, lease l, buildings b
WHERE s.sold <> 1
AND s.longitude != ' '
AND s.sitecode = l.sitecode
AND b.sitecode = s.sitecode
GROUP BY s.sitedesc
)
所需的XML示例
<rss xmlns:georss="http://www.georss.org/georss">
<channel>
<item>
<title>SITE DESCRIPTION</title>
<description>Employee Count: ###. Bldg Gross SF: ####. Owned/Leased Building1, building2, etc.</description>
<georss:point>LAT LON</georss:point>
</item>
....
</channel>
</rss>
更改您的组
select xmlelement("rss", xmlattributes('http://www.georss.org/georss' as "xmlns:georss"), xmlelement("channel", xmlagg(xmlelement("item", xmlforest(title as "title", description as "description", point as "georss:point")))))
.extract('/*')
from (select trim(s.sitedesc) as title,
'Employee Count: ' || s.sitefte || '. Bldg Gross SF: ' || s.bldgarea || '. ' || case
when s.leasestat = '0' then
'Owned'
when s.leasestat = '1' then
'Leased, end date: ' || trim(l.edate)
end || listagg(trim(b.bldgcode) || ' ' || trim(b.bldgdesc), ', ') within group(order by b.bldgcode) as description,
trim(s.latitude) || ' ' || trim(s.longitude) as point
from site s, lease l, buildings b
where s.sold <> 1
and s.longitude != ' '
and s.sitecode = l.sitecode
and b.sitecode = s.sitecode
group by s.sitedesc, s.sitefte, s.bldgarea, s.leasestat, l.edate, s.latitude, s.longitude)
这样就可以了
select xmlelement("rss", xmlattributes('http://www.georss.org/georss' as "xmlns:georss"), xmlelement("channel", xmlagg(xmlelement("item", xmlforest(title as "title", description as "description", point as "georss:point")))))
.extract('/*')
from (select trim(s.sitedesc) as title,
'Employee Count: ' || s.sitefte || '. Bldg Gross SF: ' || s.bldgarea || '. ' || case
when s.leasestat = '0' then
'Owned'
when s.leasestat = '1' then
'Leased, end date: ' || trim(l.edate)
end || listagg(trim(b.bldgcode) || ' ' || trim(b.bldgdesc), ', ') within group(order by b.bldgcode) as description,
trim(s.latitude) || ' ' || trim(s.longitude) as point
from site s, lease l, buildings b
where s.sold <> 1
and s.longitude != ' '
and s.sitecode = l.sitecode
and b.sitecode = s.sitecode
group by s.sitedesc, s.sitefte, s.bldgarea, s.leasestat, l.edate, s.latitude, s.longitude)