Hi @kasim mohamed,
Please try the following solution.
DECLARE @HTable table (HID nvarchar(50), HDate DateTime, CID nvarchar(50), CAmt decimal(18,2), EID nvarchar(50), EType nvarchar(50));
INSERT INTO @HTable values ('H1001','2023-08-22','C1001', 200, 'E1001', 'EType1');
DECLARE @DTable table (
CID nvarchar(50), -- FOREIGN KEY REFERENCES @HTable(CID)
DID nvarchar(50) PRIMARY KEY,
DType nvarchar(50));
insert into @DTable values ('C1001', 'D1001', 'DType1');
insert into @DTable values ('C1001', 'D1002', 'DType2');
DECLARE @ATable TABLE (
CID nvarchar(50), -- FOREIGN KEY REFERENCES @HTable(CID)
AID nvarchar(50) PRIMARY KEY,
ACode nvarchar(50)
);
insert into @ATable values ('C1001','A1001','ACode1');
insert into @ATable values ('C1001','A1002','ACode2');
DECLARE @OTable table (
CID nvarchar(50), -- FOREIGN KEY REFERENCES @ATable(CID, AID)
AID nvarchar(50), -- FOREIGN KEY REFERENCES @ATable(CID, AID)
OID nvarchar(50) PRIMARY KEY,
OType nvarchar(50));
insert into @OTable values ('C1001','A1001','O1001','OType1');
insert into @OTable values ('C1001','A1001','O1002','OType2');
select * from @HTable;
select * from @DTable;
select * from @ATable;
select * from @OTable;
SELECT (
SELECT p.*, (
SELECT c.*
FROM @DTable AS c
WHERE c.CID = p.CID
FOR XML PATH('DTable'), TYPE,ROOT('DTables')
)
, (
SELECT c.*, (
SELECT gc.*
FROM @OTable AS gc
WHERE c.CID = gc.CID AND c.AID = gc.AID
FOR XML PATH('OTable'), TYPE,ROOT('OTables')
)
FROM @ATable AS c
WHERE c.CID = p.CID
FOR XML PATH('ATable'), TYPE,ROOT('ATables')
)
FROM @HTable AS p
FOR XML PATH('HTable'), TYPE, ROOT('HTables')
).query('<Invoice>
{
for $p in /HTables/HTable
return (<HTable>
{$p/HID}{$p/HDate}
</HTable>,
<CTable>{$p/CID}{$p/CAmt}
<ETable>
{$p/EID}{$p/EType}
</ETable>
{
for $d in $p/DTables/DTable
return <DTable>
{$d/DID}{$d/DType}
</DTable>
}
{
for $a in $p/ATables/ATable
return <ATable>
{$a/AID}{$a/ACode}
{
for $o in $a/OTables/OTable
return <OTable>
{$o/OID}{$o/OType}
</OTable>
}
</ATable>
}
</CTable>)
}
</Invoice>');