2013-11-10 4 views
0

무엇이 문제입니까 ??? 내 작업은 다음입니다 : XML 파일이 있으며 모든 도시를 표시해야합니다. wheare는 Mick이 아닙니다. !!! 도시는 고유하지 않습니다. 예를 들어 저는 Mick-London, Tom-London, Charles-Paris입니다. 정답은 파리뿐입니다.SQL Server의 XML에 대한 XPath

쿼리는 SQL Server 2008입니다. 감사합니다.

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

당신은 그 쿼리를 사용할 수 있습니다

은 XML이다. 도시가 유일하지 않기 때문에 내부 쿼리가 있습니다. 그래서 먼저 내부 쿼리에 Mick을위한 도시를 만든 다음 바깥에있는 다른 모든 도시를 가져옵니다.

요청으로
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