Как отфильтровать атрибуты, которые имеют совпадающие значения? - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь найти названия книг с одинаковым кодом издателя и ценой в 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-файле, поэтому он не сравнивает цену кода издателя.

1 Ответ

0 голосов
/ 27 марта 2019

Когда вы пишете:

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