2012-04-09 6 views
1

Ich versuche, Korrektoren zu erhalten, die nach 2010 veröffentlicht eine oder mehrere Bücher überprüfenDistinct Ergebnis über xQuery

for $r in doc("review.xml")//Reviews//Review, 
    $b in doc("book.xml")//Books//Book 
where $b/Title = $r/BookTitle 
    and $b/Year > 2010 
return {$r/Reviewer} 

Im Folgenden sind die beiden XML-Dateien.

review.xml:

<Reviews> 
    <Review> 
     <ReviewID>R1</ReviewID> 
     <BookTitle>B1</BookTitle> 
     <Reviewer>AAA</Reviewer> 
    </Review> 
    <Review> 
     <ReviewID>R2</ReviewID> 
     <BookTitle>B1</BookTitle> 
     <Reviewer>BBB</Reviewer> 
    </Review> 
    <Review> 
     <ReviewID>R3</ReviewID> 
     <BookTitle>B2</BookTitle> 
     <Reviewer>AAA</Reviewer> 
    </Review> 
    <Review> 
     <ReviewID>R4</ReviewID> 
     <BookTitle>B3</BookTitle> 
     <Reviewer>AAA</Reviewer> 
    </Review> 
<Reviews> 

book.xml:

<Books> 
    <Book> 
     <Title>B1</Title> 
     <Year>2005</Year> 
    </Book> 
    <Book> 
     <Title>B2</Title> 
     <Year>2011</Year> 
    </Book> 
    <Book> 
     <Title>B3</Title> 
     <Year>2012</Year> 
    </Book> 
</Books> 

Ich werde zwei AAA von meinem XQuery-Code. Ich habe mich gefragt, ob ich das eindeutige Ergebnis bekommen kann, was nur ein AAA bedeutet. Ich habe distinct-value() ausprobiert, weiß aber nicht, wie ich es benutzen soll. Danke für deine Antwort!

---- Meine aktualisiert Lösung mit XML-Format für XQuery 1.0 ----

<root> 
{ 
    for $x in distinct-values 
    (
     for $r in doc("review.xml")//Reviews//Review, 
      $b in doc("book.xml")//Books//Book 
     where $b/Title = $r/BookTitle 
      and $b/Year > 2010 
     return {$r/Reviewer} 
    ) 
    return <reviewer>{$x}</reviewer> 
} 
</root> 

Antwort

1

Um Knoten zu erhalten, können Sie die „Gruppe“ Klausel verwenden und das erste Element einer Gruppe Folge wählen:

for $r in doc("review.xml")//Review, 
    $b in doc("book.xml")//Book 
let $n := $r/Reviewer 
where $b/Title = $r/BookTitle 
    and $b/Year > 2010 
group by $n 
return $r[1]/Reviewer 
+0

Ich benutze immer noch xQuery 1.0 ... Ich schätze deine Antwort sehr! – user1322538

1

Die folgende Abfrage finden Sie alle distint Rezensent Namen geben (beachten Sie, dass die Werte zerstäubt werden, die das Element bedeutet, Knoten werden entfernt):

distinct-values(
    for $r in doc("review.xml")//Reviews//Review, 
     $b in doc("book.xml")//Books//Book 
    where $b/Title = $r/BookTitle 
    and $b/Year > 2010 
    return $r/Reviewer 
) 
+0

Vielen Dank! Aber gibt es eine Möglichkeit, das Ergebnis im XML-Format auszugeben? – user1322538

+0

@ user1322538 Sie können diese Methode zuerst ausführen, um die Namen abzurufen, und dann die Datensätze mit diesen Namen auswählen. –