【问题标题】:Distinct Result via xQuery通过 xQuery 获得不同的结果
【发布时间】:2012-04-10 05:31:27
【问题描述】:

我正在努力让审阅者对 2010 年之后出版的一本或多本书籍进行审阅。

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>

我将通过我的 xQuery 代码获得两个 AAA。我想知道我是否能得到不同的结果,这意味着只有一个 AAA。我已经尝试过 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>

【问题讨论】:

    标签: distinct xquery


    【解决方案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
    

    【讨论】:

    • 我仍在使用 xQuery 1.0...不过我真的很感谢您的回复!
    【解决方案2】:

    以下查询将为您提供所有不同的审阅者名称(注意这些值是原子化的,这意味着元素节点已被删除):

    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
    )
    

    【讨论】:

    • 谢谢!但是有什么方法可以输出 XML 格式的结果吗?
    • @user1322538 您可以先执行此方法以获取名称,然后使用这些名称选择记录。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2019-06-23
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多