2012-04-09 38 views
1

我试图让谁检查一个或更多的书评审后,2010年通过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} 

以下鲜明公布结果都是XML文件。

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> 

我会得到两节AAA我的XQuery代码。我想知道如果我能得到独特的结果,这意味着只有一个AAA。我尝试了distinct-value(),但不知道如何使用它。感谢您的回复!

----我更新的解决方案与XML格式的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> 

回答

1

要保留的节点,你可以在“分组依据”子句中使用,并选择一组序列的第一个项目:

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

我仍在使用xQuery 1.0 ...我非常感谢您的回复! – user1322538 2012-04-09 21:05:56

1

下面的查询会给你所有distint审阅名称(注意,值雾化,这意味着元素节点被移除):

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

谢谢!但是有什么方法可以用XML格式输出结果吗? – user1322538 2012-04-09 20:13:36

+0

@ user1322538您可以先使用这种方法获取名称,然后使用这些名称选择记录。 – 2012-04-10 14:19:37