Выберите, используя xquery с вложенным узлом - PullRequest
0 голосов
/ 12 октября 2010

Я пытаюсь вернуть набор результатов из документа xml, используя xquery, но я не понял.

Вот мои запросы:

DECLARE @Data xml
SET @Data='<main>
 <person>
  <name>Daniel</name>
  <cars>
   <model>y75</model>
   <model>b25</model>
  </cars>
 </person>
 <person>
  <name>Marc</name>
  <cars>
   <model>h20</model>
  </cars>
 </person>
</main>'

SELECT x.value('name[1]','nvarchar(max)') name,
    x.value('cars[1]','nvarchar(max)') car
FROM   @Data.nodes('//main/person') AS e(x)

-- Returns:

-- Name  Car
------------------
-- Daniel y75b25
-- Marc  h20

Я хотел бы показать:

Name   Car
Daniel y75
Daniel b25
Marc   h20

Я пытался по-другому, но я не нашел хорошие результаты!

Спасибо.

1 Ответ

2 голосов
/ 12 октября 2010

Вы должны проецировать все модели как строки (используя .nodes()), а затем переместиться вверх по родительскому элементу, чтобы извлечь человека:

SELECT x.value('../../name[1]','nvarchar(max)') name, 
    x.value('.','nvarchar(max)') car 
FROM   @Data.nodes('//main/person/cars/model') AS e(x) 

Обновлено

Если вы хотите вернуть людей, у которых нет автомобилей, вам придется применить метод .nodes() дважды: один раз для людей, а затем еще раз для каждого, кто получит автомобили. Оператор OUTER APPLY выполнит необходимое вам «внешнее соединение»:

SELECT e.x.value('name[1]','nvarchar(max)') name, 
    c.x.value('.','nvarchar(max)') car 
FROM   @Data.nodes('//main/person') AS e(x)
outer apply e.x.nodes('./cars/model') as c(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...