0

这有什么问题???接下来是我的任务:我有一个 XML 文件,我需要显示所有没有 Mick 的城市。!!!城市并不是独一无二的。例如,我有 Mick-London、Tom-London、Charles-Paris。正确答案是仅限巴黎。

查询适用于 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])]');
4

1 回答 1

1

您可以使用该查询。它有一个内部查询,因为城市不是唯一的,所以它首先在内部查询中为 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))]');
于 2013-11-10T06:46:17.130 回答