Предварительное формирование теории множеств между столбцом xmltype и подзапросом

Я работаю с oracle db в устаревшем приложении и не могу придумать для него конкретный запрос.

В основном у меня есть одна таблица T_Selected с числовым столбцом (первичный ключ) и столбцом xmltype. XML имеет формат

<countries>
    <country>England</country>
    <country>Ireland</country>
    <country>Scotland</country>
    <country>Wales</country>
</countries>

У меня также есть другая таблица, которую мне нужно запросить и использовать результат

select country from T_Countries where language = 'English'

Мне нужно три запроса и их отрицания.

  1. Все страны в подзапросе xml ∈

  2. Подзапрос ∈ Все страны в xml

  3. Все страны в xml = всем подзапросам

Самое близкое, что я получил, это

select id from 
        T_Selected ts, 
        XMLTABLE('/countries/country'                  
                 passing ts.Values        
                 columns                                     
                 Country  path '//country'
                ) XML
        where XML.country in (select country from T_Countries 
                                                  where language ='English');

Это вернет идентификаторы, в которых любая из стран xml находится в подзапросе, а не все из них.

Любые идеи о том, как я могу это сделать?

Спасибо за помощь,

Найл


person Niall    schedule 20.05.2013    source источник


Ответы (1)


  1. Подмножество XML SUB выберите идентификатор из (выберите идентификатор из T_Selected ts, XMLTABLE('/countries/country', передавая столбцы ts.Values ​​Путь к стране '//country' ) XML) xml RIGHT OUTER join (выберите страну из T_Countries, где язык =' English') SUB) SUB на SUB.country=xml.country, где XML.country не равно null;

  2. SUB подмножество XML выберите xml.id из (выберите идентификатор из T_Selected ts, XMLTABLE('/countries/country', передавая столбцы ts.Values ​​Путь страны '//country' ) XML) q1 LEFT OUTER join (выберите страну из T_Countries, где язык ='English') SUB на SUB.country=xml.country ) q2 на q2.country=q1.country, где q2.countyid не равен нулю;

  3. UNION XML и SUB выбирают идентификатор, страну из T_Selected ts, XMLTABLE('/countries/country', передавая столбцы ts.Values ​​Путь к стране '//country' ) XML UNION ALL выбирают идентификатор, страну из T_Countries, где язык = 'English') SUB на SUB.country=xml.country ;

person Ed Spotnitz    schedule 28.05.2013
comment
Привет Эд, спасибо за ответ. Запросы все еще не совсем правильные, так как выберите идентификатор из T_Selected ts, XMLTABLE('/countries/country', передавая столбцы ts.Values ​​Country path '//country' ) возвращает строку для каждой из стран. Это приводит к тому, что результат содержит значения, в которых любая из стран находится в подзапросе, а не все они. - person Niall; 29.05.2013