如何过滤出具有匹配值的属性?

时间:2019-03-27 05:07:44

标签: mysql sql xquery

我正在尝试查找与XQuery共享相同发布商代码和相同价格的图书的书名。

我已经尝试创建2个书本变量,将它们相互比较,然后打印出最终的书名,但是由于打印不正确,因此逻辑上必定有问题。我是XQuery的新手,我正在尝试将SQL查询基本上转换为XQuery

SQL查询:

SELECT Bk1.title as T1
     , Bk2.title as T2 
  from book Bk1 
  join book Bk2 
    on Bk1.publishercode = Bk2.publishercode 
   and Bk1.bookCode < Bk2.bookCode 
   and Bk1.Price = Bk2.Price

XQuery:

<results>
{
let $book1 := doc("C:\basex\henry\Book.xml")/dataroot/Book
let $book2 := doc("C:\basex\henry\Book.xml")/dataroot/Book
for $b in ($book1,$book2)
where $book1/PublisherCode = $book2/PublisherCode and $book1/Price = $book2/Price
return
<pair>
{data($b/Title)}
</pair>
}
</results>

这应该打印出类似的内容

MatchingBook1-MatchingBook2

MatchingBook3-MatchingBook4

MatchingBook5-MatchingBook6

每行应该是一本价格和出版商代码都匹配的书的结果。

我的代码仅打印出XML文件中的每个Book标题,因此它没有对发布者代码的价格进行任何比较。

1 个答案:

答案 0 :(得分:0)

写时:

for $b in ($book1,$book2)

将每个序列的值组合成一个序列,并遍历绑定到$b的每个项目。因此,$b对每个值进行了两次迭代,一次遍历第一个序列,再遍历第二遍。

在XQuery中,当比较左侧的任何值与右侧的任何值匹配时,序列的相等比较将返回true。因此,序列变量where$book1之间的$book2子句比较总是返回true。

每个值组合都需要成对,因此需要在迭代中绑定一个变量,每个序列一个变量:

for $b1 in $book1, $b2 in $book2

然后使用这些绑定变量(每个绑定变量将是单个项目而不是序列)来应用where约束:

where $b1/PublisherCode = $b2/PublisherCode and $b1/Price = $b2/Price