Мой предыдущий вопрос был решен здесь . Теперь я добавляю к нему еще один уровень сложности - данные, которые являются вложенными родительскими, дочерними, внуковыми.
Вы можете увидеть и запустить пример здесь: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=df2766c95383d4c8c2d1f55539634341
Пример кода, где Leg1 может быть отключением, а Leg2 может быть обратным. На каждом этапе может быть один или несколько перелетов.
DECLARE @xml XML='
<Reservation>
<Name>Neal</Name>
<Leg seq=''1''>
<Flight>12</Flight>
</Leg>
<Leg seq=''2''>
<Flight>34</Flight>
<Flight>56</Flight>
</Leg>
</Reservation>'
select @xml
DECLARE @xmlTable TABLE (
xmlDoc Xml
);
Insert into @xmltable values (@xml)
--Select xmlDoc from @XmlTable
Select xmlDoc.value('(//Name)[1]', 'varchar(30)') as Passenger,
XmlData2.xmlDoc2.query('.') as XmlData2,
XmlData2.xmlDoc2.value('./@seq', 'int') as LegSeq,
XmlData3.xmlDoc3.query('.') as XmlData3,
XmlData3.xmlDoc3.value('.', 'varchar(20)') as Flight
FROM @xmlTable as t
CROSS APPLY
t.xmlDoc.nodes('//Leg') AS XmlData2(xmlDoc2)
CROSS APPLY
t.xmlDoc.nodes('//Flight') AS XmlData3(xmlDoc3)
Проблема в том, что мне все еще нужно вернуть 3 строки, но теперь я получаю 6.
![enter image description here](https://i.stack.imgur.com/UQ5Ru.jpg)
Ожидаемый результат:
Neal LegSeq=1 Flight=12
Neal LegSeq=2 Flight=34
Neal LegSeq=2 Flight=56
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) 24 сентября 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Developer Edition (64-разрядная версия) на Windows Server 2019 Standard 10.0 (сборка 17763:)