2014-06-02 5 views
1

У меня есть следующий XML-файл в XML-таблице oracle. Я знаю очень простые таблицы XQuery и XML. Я задавался вопросом, каковы возможные решения для поиска всех городов, не посещаемых конкретным транспортным средством (регистрационный номер).
Я думал, что сначала мне нужно «за цикл», чтобы сохранить имя всех городов, а затем еще один «цикл». Я должен проверить, посетил ли этот город транспортное средство. Есть ли способ вычесть название городов, посещаемых конкретным транспортным средством, из списка всех городов.Как вычесть два результата запроса в XQuery в базе данных Oracle XML?

(название всех городов) - (города, посещаемые автомобиля) = (города не посетили автомобиль)

Вот мой файл XML (я не имею список городов) :

<trips> 
    <trip driver="d2345" vehicle="PKR856" date="12-DEC-2007"> 
    <from>London</from> 
    <to>Newcastle</to> 
    <through stop="1">Leicester</through> 
    <through stop="2">Nottingham</through> 
    <time>1</time> 
    </trip> 
    <trip driver="d6767" vehicle="UUQ007" date="10-MAY-2008"> 
    <from>Paris</from> 
    <to>Rome</to> 
    <through stop="1">Lyon</through> 
    <through stop="2">Milan</through> 
    <time>15</time> 
    </trip> 
    <trip driver="d2345" vehicle="PKR856" date="14-DEC-2007"> 
    <from>Paris</from> 
    <to>Amsterdam</to> 
    <through stop="2">Brussel</through> 
    <through stop="1">Mons</through> 
    <time>4</time> 
    </trip> 
</trips> 

Я попытался

Это список всех городов:

for $form in /transport/trips/trip/from 
for $to in /transport/trips/trip/to 
return 
    <result> 
      {$from/text()} 
      {$to/text()} 
    </result> 

Список городов, посещенных конкретного автомобиля:

for $c in /transport/trips/trip/ 
where (data ($c/@ vehicle)=""PKR856"") 
    <result2> 
      {$c/from/text()}    
      {$c/to/text()} 
    </result2> 

Я признателен, если кто-нибудь может мне помочь, чтобы вычесть эти списки.

+0

Обязательно отправьте правильный код, в вашем последнем блоке кода есть несколько синтаксических проблем. –

ответ

1

Учитывая у вас есть города, как последовательности строк, используйте предикат вместе с заданной-семантикой = фильтровать все посещенные города:

let $cities := ("Munich", "Berlin", "Hamburg") 
let $visited := ("Munich", "Frankfurt") 
return $cities[not(. = $visited)] 

который будет возвращать города Берлин и Гамбург.

= возвращает true, если какой-либо элемент с левой стороны (здесь: всегда один город) соответствует любому элементу с правой стороны (все посещенные города). Realize $cities[. != $visited] таким образом вернет что-то еще: != дает true, если какое-либо значение в левой части не соответствует никакому значению с правой стороны.

1

Это можно сделать только в XPath. В следующем фрагменте $driver-cities выберет все названия городов, посещенных одним конкретным автомобилем. Если ваш процессор не поддерживает синтаксис /(element, another-element), вы также можете использовать оператор объединения, т. Е. /trips/trip[@vehicle="PKR856"]/from | /trips/trip[@vehicle="PKR856"]/to.

Затем он выбирает все города, которые не находятся в последовательности $driver-cities, как уже объяснялось в ответе Йенса.

let $driver-cities := /trips/trip[@vehicle="PKR856"]/(from, to, through)/string() 
return /trips/trip/(from, to)/string()[not(. = $driver-cities)] 
+0

Я получаю внутреннюю ошибку в oracle, когда я добавил [not (. = $ Driver-cities)] – Bernard

+0

Что такое сообщение об ошибке? Пожалуйста, дополните – dirkk