1

2010 年以降に出版された本を 1 冊以上レビューしてくれるレビュアーを獲得しようとしています。

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}

以下は両方とも XML ファイルです。

レビュー.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>

xQuery コードで 2 つの AAA を取得します。AAA が 1 つだけという明確な結果が得られるかどうか疑問に思っていました。私はdistinct-value()を試しましたが、おそらくそれを使用する方法がわかりません. お返事をありがとうございます!

----xQuery 1.0 の XML 形式を使用した私の更新されたソリューション----

<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>
4

2 に答える 2

1

ノードを保持するには、「group by」句を使用して、グループ シーケンスの最初の項目を選択できます。

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
于 2012-04-09T20:49:32.037 に答える
1

次のクエリは、すべての異なるレビュアー名を取得します (値は原子化されていることに注意してください。つまり、要素ノードが削除されます)。

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
)
于 2012-04-09T19:59:08.753 に答える