我正在尝试查找与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标题,因此它没有对发布者代码的价格进行任何比较。
答案 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