首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分裂一个序列

分裂一个序列
EN

Stack Overflow用户
提问于 2018-03-25 11:27:03
回答 1查看 97关注 0票数 1

作为数据库课程的一部分,我刚刚开始使用xQuery。在本课程中,我们使用的是这里找到的单刻度数据库(https://www.dbis.informatik.uni-goettingen.de/Mondial/)。基本上,数据库包含了关于世界、国家、湖泊、河流等的信息。

我们的一项任务是把所有有岛屿的湖泊的面积按大陆划分成一组。到目前为止,我已经这样做了:

代码语言:javascript
复制
let $lakes := 
    for $lakeList in doc("mondial.xml")/mondial/lake[@island]
      for $country in doc("mondial.xml")/mondial/country

      where $lakeList/located/@country = $country/@car_code

  return <lake area = "{$lakeList/area}" country = "{$country/name}" continent = "{$country/encompassed/@continent}" continentPerc = "{$country/encompassed/@percentage}"></lake> 

return ($lakes)

此查询生成以下结果:

代码语言:javascript
复制
<lake area="40.2" country="Denmark" continent="europe" continentPerc="100"/>
<lake area="56" country="United Kingdom" continent="europe" continentPerc="100"/>
<lake area="71" country="United Kingdom" continent="europe" continentPerc="100"/>
<lake area="10" country="Russia" continent="europe asia" continentPerc="25 75"/>
<lake area="670" country="Japan" continent="asia" continentPerc="100"/>
<lake area="1.8" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="234.2" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="0.3" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="911" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="354.6" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="1103" country="Indonesia" continent="asia australia" continentPerc="78 22"/>
<lake area="0.04" country="Indonesia" continent="asia australia" continentPerc="78 22"/>
<lake area="11.3" country="Indonesia" continent="asia australia" continentPerc="78 22"/>
<lake area="537.5" country="Canada" continent="america" continentPerc="100"/>
<lake area="5542" country="Canada" continent="america" continentPerc="100"/>
<lake area="104" country="Canada" continent="america" continentPerc="100"/>
<lake area="38.7" country="Canada" continent="america" continentPerc="100"/>

现在,求和的问题似乎是某些属性包含多个值。因此,不可能按大陆分组。为此,我想将具有多个大陆和continentPerc的序列分割开来,这样区域就会腐蚀到各自的大陆。

例子,我的意思是:

代码语言:javascript
复制
<lake area="1103" country="Indonesia" continent="asia australia" continentPerc="78 22"/>

应该变成

代码语言:javascript
复制
<lake area="1103" country="Indonesia" continent="asia" continentPerc="78"/>

<lake area="1103" country="Indonesia" continent="australia" continentPerc="22"/>

这是以某种方式实现的,还是我应该选择另一种策略?

我非常感谢我能得到的任何帮助和指示,因为我在Xquery方面很差。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-03-25 12:37:27

我不太熟悉这个数据库结构,我也不确定我是否理解这个问题(仍然怀疑一个湖泊是否属于亚洲和澳大利亚),但是如果你直接提取大陆上的大陆并将其分组,就像在

代码语言:javascript
复制
let $countries := doc('mondial.xml')/mondial/country
for $lake in doc("mondial.xml")/mondial/lake[@island]
for $continent in $countries[@car_code = tokenize($lake/@country, '\s+')]/encompassed/@continent
group by $continent
order by $continent
return <continent name="{$continent}">{$lake/<lake name="{@id}" area="{area}"/>}</continent>

那你就能得到

代码语言:javascript
复制
<continent name="america">
   <lake name="lake-Hazen" area="537.5"/>
   <lake name="lake-Nettilling" area="5542"/>
   <lake name="lake-Lake_Manitou" area="104"/>
   <lake name="lake-Mindemoya" area="38.7"/>
</continent>
<continent name="asia">
   <lake name="lake-KoltsevoyeLake" area="10"/>
   <lake name="lake-Biwa" area="670"/>
   <lake name="lake-Pinatubo" area="1.8"/>
   <lake name="lake-Taal" area="234.2"/>
   <lake name="lake-TaalCrater" area="0.3"/>
   <lake name="lake-LagunaDeBay" area="911"/>
   <lake name="lake-Lanao" area="354.6"/>
   <lake name="lake-Toba" area="1103"/>
   <lake name="lake-DanauKumbang" area="0.04"/>
   <lake name="lake-SegaraAnak" area="11.3"/>
</continent>
<continent name="australia">
   <lake name="lake-Toba" area="1103"/>
   <lake name="lake-DanauKumbang" area="0.04"/>
   <lake name="lake-SegaraAnak" area="11.3"/>
   <lake name="lake-LakeTaupo" area="622"/>
   <lake name="lake-Wanaka" area="192"/>
</continent>
<continent name="europe">
   <lake name="lake-Arresoe" area="40.2"/>
   <lake name="lake-LoughNeagh" area="392"/>
   <lake name="lake-LochNess" area="56"/>
   <lake name="lake-LochLomond" area="71"/>
   <lake name="lake-KoltsevoyeLake" area="10"/>
</continent>

试着把我想出来的国家数据和百分比数据

代码语言:javascript
复制
let $countries := doc('mondial.xml')/mondial/country
for $lake in doc("mondial.xml")/mondial/lake[@island]
for $lake-country in $countries[@car_code = $lake/located/@country]
for $continent in $lake-country/encompassed
group by $continent-name := $continent/@continent
order by $continent-name
return 
  <continent name="{$continent-name}">{
     $lake!<lake name="{@id}"
                        area="{area}"
                        country="{let $l := . return $countries[@car_code = $l/located/@country and encompassed[@continent = $continent-name]]/name}"
                        percentage="{let $l := . return $countries[@car_code = $l/located/@country]/encompassed[@continent = $continent-name]/@percentage}"/>
    }</continent>

我希望有更优雅和紧凑的方式来表达这一点,但它似乎做到了这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49475291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档