for
- это итерационное предложение.Он строит результат на основе данного запроса.Давайте пройдемся по вашему коду и посмотрим, что он означает.
for $c in /university/course
выполняет свою ограниченную строку (какой бы ни был код под ним ..) для каждого элемента под /university/course
.То же самое относится к /university/instructor
и /university/teaches
.
Без фильтра для teaches
, как указано в [$c/course_id= $t/course_id and $t/IID = $i/IID]
- вы по существу имеете CROSS JOIN между cource
, instructor
и teaches
, которые возвращают умножение трех результатов.
Теперь - я сказал перекрестное соединение?Поскольку вы не создали ожидаемый результат, это должно сбивать с толку.В каждом операторе соединения (если вы немного знаете SQL ...) предложение SELECT стоит первым (даже если оно может быть обработано в конце концов ...), в отличие от XQuery, где вы создаете свою логику - а затем вырешите, что возвращать, как указано в return <course instructor> { $c $i } </course instructor>
.
. В своем операторе return
вы указываете XQuery, что: для каждой записи в результатах, возвращаемых перекрестным объединением трех результатов, $c
, $i
и $t
- создайте новый элемент course instructor
- и поместите $c
и $i
в качестве его дочерних элементов.
небольшая заметка: имена элементов / атрибутов не могут содержать пробелы,Я не уверен, как "преподаватель курса" повлияет на результат вашего xquery. Подробнее см. Здесь