Вы должны проецировать все модели как строки (используя .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)