2013-11-10 1 views
0

Что не так с этим ??? Моя задача следующая: у меня есть XML-файл, и мне нужно показать, что все города не видят Мика. !!! Города не уникальны. Так, например, у меня есть Мик-Лондон, Том-Лондон, Чарльз-Париж. Правильный ответ - только в Париже.XPath по XML в SQLServer

Запрос на SQL Server 2008. Благодарим за помощь.

Это XML:

declare @x xml 
set @x = '<database> 
    <persons> 
    <person fio="Mick" id="1" /> 
    <work city="London" size="450" /> 
    <state>United Kingdom  </state> 
    </persons> 
    <persons> 
    <person fio="Tom" id="8" /> 
    <work city="London" size="500" /> 
    <state>UK</state> 
    </persons> 
    <persons> 
    <person fio="Charles" id="9" /> 
    <work city="Paris" size="450000" /> 
    <state>Frace</state> 
    </persons> 
    <persons> 
    <person fio="Some_name1" id="10" /> 
    <work city="Brussels" size="30000" /> 
    <state>Belgium</state> 
    </persons> 
    <persons> 
    <person fio="Some_name2" id="11" /> 
    <work city="Munich" size="30000" /> 
    <state>Germany</state> 
    </persons> 
</database>' 

Мой текущий сценарий:

select @x.query('//work[not(//person[@fio="Mick" and @city = this/../work/@city])]'); 
+0

Почему ответ Париж только? Мик только в Лондоне ... – Szymon

+1

Извините, за смущение. В этом XML-ответе есть Париж, Брюссель, Мюнхен. – Tigran

ответ

1

Вы можете использовать этот запрос. У этого есть внутренний запрос, поскольку города не уникальны, поэтому он сначала строит города для Мика во внутреннем запросе, а затем получает все остальные города во внешнем.

select 
    y.work.value('(@city)[1]', 'nvarchar(100)') 
from @x.nodes('//persons/work') y(work) 
where y.work.value('(@city)[1]', 'nvarchar(100)') not in 
    (select 
     x.work.value('(@city)[1]', 'nvarchar(100)') 
    from @x.nodes('//persons[person[@fio="Mick"]]/work') x(work)) 

В соответствии с просьбой, этот запрос будет использовать только query:

select @x.query('//work[not(@city = (//persons[person[@fio="Mick"]]/work/@city))]'); 
+0

Спасибо. Но эта задача должна выполняться только через XPath или XQuery. Ваше решение отлично, но возможно ли это сделать только через XPath? – Tigran

+0

Позвольте мне взглянуть на него еще раз. – Szymon

+1

Проверьте мое обновление. – Szymon

 Смежные вопросы

  • Нет связанных вопросов^_^