簡體   English   中英

XQuery-嘗試將SQL查詢轉換為Xquery(分組依據,總和,內部聯接),但失敗了

[英]XQuery - Trying to translate SQL query to Xquery (group by, sum, inner join) and miserably failing

所以我想這樣做:

“生成一張表,列出所有大洲以及每個大洲至少包含一個島的所有湖泊的面積之和。如果一個湖泊位於一個位於多個大洲的國家中,則應適當分配湖泊面積每個大陸都算在內。”

使用此XML數據庫: https : //www.dbis.informatik.uni-goettingen.de/Mondial/mondial.xml

我已經有一個執行此操作的SQL查詢:

WITH LakesWithIslands AS (
    SELECT DISTINCT IslandIn.lake, Lake.area, geo_lake.country
    FROM ((IslandIn
    INNER JOIN Lake ON IslandIn.lake = Lake.name)
    INNER JOIN geo_lake ON IslandIn.lake = geo_lake.lake)
    WHERE IslandIn.lake IS NOT NULL
    ) 

SELECT B.continent, SUM(B.percentage * A.area / 100)
    FROM LakesWithIslands as A
    INNER JOIN encompasses as B ON A.country = B.country
    GROUP BY B.continent;

但是現在我正在嘗試將此SQL查詢轉換為Xquery。

XQuery代碼:

let $doc := doc("mondial.xml")/mondial
let $lakesWithIslands := $doc/island/data(@lake)
let $lakeData := (
  for $l in $doc/lake
  let $lakeId := $l/data(@id)
  where $lakeId = $lakesWithIslands
  return <lake id="{$lakeId}" country="{$l/data(@country)}" area="{$l/data(area)}"     ></lake>
)
let $countryData :=(
  for $c in $doc/country
  let $countrycode := $c/data(@car_code)
  let $encompassData := $c/encompassed
    for $e in  $encompassData
    let $continent := $e/data(@continent)
    let $percent := $e/data(@percentage)
    return <country country="{$countrycode}" continent="{$continent}" percentage="{$percent}"></country>
)

for $l in $lakeData,
    $c in $countryData
let $lCountry := $l/data(@country)
let $lArea := $l/data(@area)
let $cContinent := $c/data(@continent)
let $cCountry := $c/data(@country)
let $percent := $c/data(@percentage) 
where $lCountry = $cCountry
group by $cContinent
return <item continent="{$cContinent}" area="{sum(($percent*$lArea) div 100)}"></item>

我在最后一步(最后一個for循環)失敗了,我不確定自己做錯了什么。 我剛得到一個錯誤,提示“ [XPTY0004]預期的項目,找到的序列:(“ 25”,“ 25”)“。

我很確定自己做的最后一個for循環完全錯誤,但是我不知道如何在Xquery中使用內部聯接,分組和求和。

請幫忙。

編輯:今天在這里發布有關Xquery的很多問題令我感到難過,但我真的很難把頭放在Xquery的實際部分上。 勞駕。

從某種意義上說,與典型的SELECT / FROM / WHERE SQL查詢相比,您的代碼通常更需要遵循數據的結構,因此XQuery比SQL的“聲明性更少”。 連接可以通過嵌套的FLWOR表達式自然執行,不僅可以通過收集偽表中的所有數據然后進行匹配來進行。

對於您的具體任務,最簡單的方法是遍歷所有國家和所處的大洲,為每個國家/大陸組合收集相關的湖泊及其區域的一部分,然后按大洲進行分組:

declare variable $lakes-with-islands :=
    for $lake-id in distinct-values(doc('mondial.xml')//island/@lake)
    return doc('mondial.xml')//lake[@id = $lake-id];

for $country in doc('mondial.xml')//country
let $lakes-in-country :=
    $lakes-with-islands[contains-token(@country, $country/@car_code)]
for $encompassed in $country/encompassed
let $proportional-areas :=
    for $lake in $lakes-in-country
    return $lake/area * $encompassed/@percentage div 100
group by $continent := $encompassed/@continent
return <continent name="{$continent}">{sum($proportional-areas)}</continent>

返回:

<continent name="europe">7875.5</continent>
<continent name="asia">24721.34</continent>
<continent name="africa">206610</continent>
<continent name="australia">242.66</continent>
<continent name="america">155036.7</continent>

這個國家湖泊在多個國家/地區之間多次共享,但這似乎是問題描述所想要的。

$lakes-with-islands被聲明為靜態變量,因此group by子句不會觸及它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM