2017-05-05 22 views
1

我很努力的理解如何使用嵌套的FLWOR表達式和group by。這裏是一個示例XML文檔,以及我想要做什麼和什麼。使用「group by」並嵌套FLWOR

<review> 
<critic name="Critic1"> 
<book> 
    <name>ABC</name> 
    <rating>6</rating> 
</book> 
<book> 
    <name>Monsters</name> 
    <rating>2</rating> 
</book> 
<book> 
    <name>Spring Poems</name> 
    <rating>5</rating> 
</book> 
</critic> 
<critic name="Critic2"> 
<book> 
    <name>ABC</name> 
    <rating>2</rating> 
</book> 
<book> 
    <name>Cooking101</name> 
    <rating>7</rating> 
</book> 
<book> 
    <name>Aliens?</name> 
    <rating>10</rating> 
</book> 
</critic> 
</review> 

基本上我所要做的是按每一本書名的數據,然後每本書下顯示審視,而比分,他們給了那本書的每個評論家。

是我到目前爲止的查詢是

for $books in doc("reviews.xml")/review/critic/book 
let $critics := doc("reviews.xml")/review/critic 
let $d := $books/name 
group by $d 
order by $d 
return <book name="{$d}">{ 
    for $hasReview in $critics 
    where $critics/book/name = $d 
    group by $n := $d 
    return <critic name="{$critics/@name}" rating=" 
      {$critics/book[name=$d]/rating}"/> 

    }</book> 

從該查詢輸出看起來像

<book name ="ABC"> 
    <critic name = "Critic1 Critic2" rating="6 2"/> 
</book> 
<book name ="Monsters"> 
    <critic name = "Critic1 Critic2" rating="2"/> 
</book> 
<book name ="Spring Poems"> 
    <critic name = "Critic1 Critic2" rating="5"/> 
</book> 
<book name ="Cooking101"> 
    <critic name = "Critic1 Critic2" rating="7"/> 
</book> 
<book name ="Aliens"> 
    <critic name = "Critic1 Critic2" rating="10"/> 
</book> 

我想獲得的輸出類似於這樣:

<book name ="ABC"> 
    <critic name = "Critic1" rating="6"/> 
    <critic name = "Critic2" rating="2"/> 
</book> 
<book name ="Monsters"> 
    <critic name = "Critic1" rating="2"/> 
</book> 
<book name ="Spring Poems"> 
    <critic name = "Critic1" rating="5"/> 
</book> 
<book name ="Cooking101"> 
    <critic name = "Critic2" rating="7"/> 
</book> 
<book name ="Aliens"> 
    <critic name = "Critic2" rating="10"/> 
</book> 

回答

1

我還沒有使用過group,因爲我從來沒有使用任何支持它的軟件。所以我會以這種方式:

for $bookName in distinct-values(doc("reviews.xml")/review/critic/book/name) 
order by $bookName 
return <book name="{$bookName}">{ 
    for $critic in doc("reviews.xml")/review/critic/book[name eq $bookName] 
    return <critic name="{$critic/../@name}" rating="{$critic/rating}" /> 
}</book> 

當你的樣本數據嘗試了這一點,我得到了以下結果:

<book name="ABC"> 
    <critic name="Critic1" rating="6"/> 
    <critic name="Critic2" rating="2"/> 
</book> 
<book name="Aliens?"> 
    <critic name="Critic2" rating="10"/> 
</book> 
<book name="Cooking101"> 
    <critic name="Critic2" rating="7"/> 
</book> 
<book name="Monsters"> 
    <critic name="Critic1" rating="2"/> 
</book> 
<book name="Spring Poems"> 
    <critic name="Critic1" rating="5"/> 
</book> 

不受甚至你在找什麼在這裏肯定組。通過查看你的輸出,它似乎奇怪地將兩個評論節點的屬性合併爲一個屬性(這可能只是它應該做的,但它不是你所需要的)